Spring Boot OAuth2 手动创建新的 JWT token

标签 spring spring-security spring-security-oauth2 spring-social spring-oauth2

在我的 Spring Boot 应用程序中,我已经使用 JWT token 配置了 Spring OAuth2 服务器。

此外,我还添加了 Spring Social 配置,以便能够通过 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));
    }

...

}

此外,基于民歌答案 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 访问 token :

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

但我需要创建 JWT token 。

如何创建此 token 或将此 token 转换为基于 JWT 的 token ?我想我可以使用 JwtAccessTokenConverter 类来实现此目的,但目前不知道如何操作。

最佳答案

在我想要自己的自定义 JWT token 之后,这对我有用。

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

Autowiring jwtAccessTokenConverter

@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;

关于Spring Boot OAuth2 手动创建新的 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705496/

相关文章:

java - 我搜索了每个帖子,但无法解决我的错误

spring - 运行时出错 : java. lang.ClassNotFoundException : org. springframework.web.context.ContextLoaderListener

jquery - session 超时后,对第一个请求的后续 AJAX post 请求将抛出 InvalidCsrfTokenException

Grails Spring Security SAML 插件 "SPSSODescriptor wasn' t 找到”

java - 使用我的自定义外部登录与 spring boot oauth2 (授权授予类型)?

java - 如何包装 OAuth2 异常?

java - 如何使用 Spring Security Oauth 忽略某些端点

java - 为 Spring WebSocket 设置 CSRF

java - Spring:根据配置文件选择@Service

Grails with SpringSecurity,检查当前用户是否可以访问 Controller / Action