3 votes

Spring Boot OAuth2 créer manuellement un nouveau jeton JWT

Dans mon application Spring Boot, j'ai configuré le serveur Spring OAuth2 avec des jetons JWT.

J'ai également ajouté la configuration de Spring Social afin de pouvoir authentifier les utilisateurs via différents réseaux sociaux tels que Twitter, Facebook, etc.

C'est mon SpringSocial config :

@Configuration
@EnableSocial
public class SocialConfig extends SocialConfigurerAdapter {

    @Bean
    public ProviderSignInController providerSignInController(ConnectionFactoryLocator connectionFactoryLocator, UsersConnectionRepository usersConnectionRepository) {
        return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new SimpleSignInAdapter(authTokenServices, "client_id", userService));
    }

...

}

De plus, d'après la réponse de Folksing. Intégrer Spring Security OAuth2 et Spring Social J'ai mis en œuvre SimpleSignInAdapter afin d'assurer une authentification réussie auprès de réseaux sociaux tiers :

public class SimpleSignInAdapter implements SignInAdapter {

    final static Logger logger = LoggerFactory.getLogger(SimpleSignInAdapter.class);

    public static final String REDIRECT_PATH_BASE = "/#/login";
    public static final String FIELD_TOKEN = "access_token";
    public static final String FIELD_EXPIRATION_SECS = "expires_in";

    private final AuthorizationServerTokenServices authTokenServices;
    private final String localClientId;
    private final UserService userService;

    public SimpleSignInAdapter(AuthorizationServerTokenServices authTokenServices, String localClientId, UserService userService){
        this.authTokenServices = authTokenServices;
        this.localClientId = localClientId;
        this.userService = userService;
    }

    @Override
    public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {

        UserDetails userDetails = loadUserById(Long.parseLong(userId));

        OAuth2AccessToken oauth2Token = authTokenServices.createAccessToken(convertAuthentication(userDetails)); 
        String redirectUrl = new StringBuilder(REDIRECT_PATH_BASE)
            .append("?").append(FIELD_TOKEN).append("=")
            .append(encode(oauth2Token.getValue()))
            .append("&").append(FIELD_EXPIRATION_SECS).append("=")
            .append(oauth2Token.getExpiresIn())
            .toString();    

        return redirectUrl;
    }

    private OAuth2Authentication convertAuthentication(UserDetails userDetails) {
        OAuth2Request request = new OAuth2Request(null, localClientId, null, true, null, null, null, null, null);
        return new OAuth2Authentication(request, new UsernamePasswordAuthenticationToken(userDetails, "N/A", userDetails.getAuthorities()));
    }

    private String encode(String in) {
        String res = in;
        try {
            res = UriUtils.encode(in, "UTF-8");
        } catch(UnsupportedEncodingException e){
            logger.error("ERROR: unsupported encoding: " + "UTF-8", e);
        }
        return res;
    }

    public UserDetails loadUserById(Long id) throws UsernameNotFoundException {
        User user = userService.findUserById(id);
        if (user == null) {
            throw new UsernameNotFoundException("User " + id + " not found.");
        }

        Set<Permission> permissions = userService.getUserPermissions(user);
        return new DBUserDetails(user, permissions);
    }

}

Tout fonctionne bien, sauf une chose : la ligne de code suivante produit un jeton d'accès OAuth2 simple :

OAuth2AccessToken oauth2Token = authTokenServices.createAccessToken(convertAuthentication(userDetails));

mais j'ai besoin de créer un jeton JWT à la place.

Comment créer ou convertir ce jeton en JWT ? Je suppose que je peux utiliser JwtAccessTokenConverter dans ce but, mais je ne sais pas comment faire pour le moment.

2voto

alexanoid Points 6568

Après avoir débogué, j'ai trouvé une solution :

private final TokenEnhancer tokenEnhancer;

...
OAuth2Authentication authentication = convertAuthentication(userDetails);
OAuth2AccessToken accessToken = authTokenServices.createAccessToken(authentication); 
accessToken = tokenEnhancer.enhance(accessToken, authentication);

2voto

ionyekanna Points 61

Cela a fonctionné pour moi, après avoir voulu mon propre jeton JWT personnalisé.

DefaultTokenServices service = new DefaultTokenServices(); 
    service.setTokenStore(jwtAccessTokenConverter);
    service.setTokenEnhancer(jwtAccessTokenConverter);
    OAuth2AccessToken token = service.createAccessToken(authentication);

Autocontrôle du jwtAccessTokenConverter

@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X