当前位置: 首页 > 知识库问答 >
问题:

Spring Boot OAuth2手动创建新的JWT令牌

鲁浩言
2023-03-14

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

此外,我还添加了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));
    }

...

}

此外,基于民间的答案集成Spring Security OAuth2和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个答案

方宜
2023-03-14

经过调试,我找到了一个解决方案:

private final TokenEnhancer tokenEnhancer;

...
OAuth2Authentication authentication = convertAuthentication(userDetails);
OAuth2AccessToken accessToken = authTokenServices.createAccessToken(authentication); 
accessToken = tokenEnhancer.enhance(accessToken, authentication);
 类似资料:
  • 在我最近的遭遇中,我试图实现在前端安全存储的JWT令牌。我以前的方法是在易受XSS攻击的sessionStorage中存储以及。现在,当过期时,我将调用endpoint来获取新的 之后,我们更改实现以防止XSS和CSRF。接下来,Local存储与Cookie 建议将访问令牌存储在内存中,并将刷新令牌存储在cookie中。所以从FE,我们无法访问cookie。(HTTPOnly cookie)和 现

  • 问题内容: 我需要以不同的方式循环许多数组并将其显示在页面中。数组由模块类生成。我知道最好不要在“视图”上包含函数,而且我想知道在哪里插入函数文件。 我知道我可以“扩展”助手,但是我不想扩展助手。我想用我的循环函数创建一个助手。让我们称之为loops_helper.php 问题答案: CodeIgniter助手是一个具有多种功能的PHP文件。 这不是一堂课 创建一个文件,并将以下代码放入其中。 将

  • 我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。 最好的方法似乎是将JWT访问令牌与刷新令牌配对,这样我就可以根据需要频繁地使访问令牌过期。 刷新令牌是什么样子的?是随机字符串吗?那串加密了吗?是另一个JWT吗? 刷新令牌将存储在用户模型的数据库中以便访问,对吗?在这种情况下似乎应该加密 在用户登录后,我是否会将刷新令牌发送回,然后让客户端访问单独的路由来检索访问令牌?

  • 问题内容: 我遇到一种情况,我想自己创建一个访问令牌(因此不能通过通常的过程)。我想出了这样的东西: 唯一的问题是我不确定如何创建OAuth2Authentication(在我的代码中带有xxx的部分)。我有用户和客户信息,我知道我想授予该令牌的单位。 问题答案: 在这里,根据使用的流程,您的用例可能会略有不同。这适用于密码授予流程。有一些自定义类,如令牌存储,令牌增强器等。但这实际上只是为满足我

  • 本文向大家介绍playframework 手动创建JSON,包括了playframework 手动创建JSON的使用技巧和注意事项,需要的朋友参考一下 示例 您可以JsValue手动构建JSON对象树(a ) 或使用较短的等效语法,基于一些隐式转换: 要获取JSON字符串:            

  • 我正在使用Tymon提供的包来处理从我的laravel后端到spa前端的Auth,我正在创建AuthController,这几乎是我从文档中获取的,只是稍微调整一下它以满足我的需要。从登录到注销以及令牌过期,一切正常。 问题是,我确实看到该控制器上有一个令牌刷新功能,如果我的猜测是正确的,那就是刷新客户端已经拥有的当前令牌。但是怎么做呢?如何处理前端上的刷新令牌?因为它是相当烦人的,每60分钟(默