web-dev-qa-db-fra.com

Accès au jeton JWT à partir d'un contrôleur Spring Boot Rest

J'implémente une API REST avec Spring Boot et je la sécurise avec JWT et Oauth 2.

Je n'ai aucun problème avec l'authentification et la production d'un jeton d'accès.

Lorsqu'un utilisateur fait une demande, je souhaite accéder à son jeton JWT à partir du contrôleur.

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<AppUser> getUsers(OAuth2Authentication auth) {
    logger.info("CREDENTIALS:" + auth.getCredentials().toString());
    logger.info("PRINCIPAL:" + auth.getPrincipal().toString());
    logger.info("OAuth2Request:" + auth.getOAuth2Request());
    logger.info("UserAuthentication:" + auth.getUserAuthentication());
    return userService.findAllUsers();
}

J'ai essayé quelque chose comme ci-dessus mais je n'ai pas pu atteindre le jeton, je ne reçois que le nom d'utilisateur. Existe-t-il un moyen d'y parvenir dans Spring Boot?

Toute aide serait appréciée.

3
Tartar

Tartre,

L'interface utilisateur envoie-t-elle le jeton en-tête dans la demande? si tel est le cas, vous pouvez obtenir cette valeur en utilisant l'annotation @RequestHeader dans votre méthode

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<AppUser> getUsers(OAuth2Authentication auth, @RequestHeader (name="Authorization") String token) 

Remarque: Pour cet exemple, "Autorisation" est le nom d'en-tête qui contient le jeton, il peut s'agir d'un nom d'en-tête personnalisé.

À votre santé!

10
Karl

La réponse fournie par Karl devrait résoudre votre problème.

En plus de cette réponse, vous pouvez utiliser la méthode suivante et accéder au jeton n'importe où dans le code

public static String getToken() {
    String token = null;
    var authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null) {
      token = ((OAuth2AuthenticationDetails) authentication.getDetails()).getTokenValue();
    }
    return token;
  }
10
Abhijay