1

В моем приложении Spring Boot я настроил сервер Spring OAuth2 с токенами JWT.Spring Boot OAuth2 вручную создает новый токен JWT

Также я добавил Spring Social configuration, чтобы иметь возможность аутентифицировать пользователей через различные социальные сети, такие как Twitter, Facebook и т. Д.

Это мой SpringSocial конфигурации:

@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)); 
    } 

... 

} 

Кроме того, на основе folksinging ответа Integrate Spring Security OAuth2 and Spring Social я реализованного SimpleSignInAdapter для того, чтобы справиться с успешной аутентификации с 3rdParty социальных сетей:

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); 
    } 

} 

Все отлично работает кроме одного - следующая строка кода создает простой токен доступа OAuth2:

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

, но вместо этого мне нужно создать токен JWT.

Как создать или преобразовать этот токен в JWT? Я полагаю, что для этой цели я могу использовать класс JwtAccessTokenConverter, но не знаю, как в данный момент.

ответ

1

После отладки я нашел решение:

private final TokenEnhancer tokenEnhancer; 

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

Это работает для меня, после того, как я хотел, чтобы мой собственный маркер пользовательского JWT.

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

Autowire jwtAccessTokenConverter

@Autowired 
private JwtAccessTokenConverter jwtAccessTokenConverter;