如何使用 Spring OAuth2 JWT 令牌?

Posted

技术标签:

【中文标题】如何使用 Spring OAuth2 JWT 令牌?【英文标题】:How to use Spring OAuth2 JWT Token? 【发布时间】:2015-04-16 21:10:32 【问题描述】:

我们希望使用 Spring OAuth2 JWT 令牌支持。我们的架构如下:Spring 只提供一个 REST 接口,前端是用 AngularJS 构建的,它查询 Spring-REST 接口。出于授权目的,我们的前端团队想要使用 JWT。因此,我查看了 Spring OAuth2 JWT 支持,但仍然不知道如何与前端讨论 JWT-Tokens。在阅读了一个小教程后,我已经实现了这个:

@Autowired
@Qualifier("defaultAuthorizationServerTokenServices")
private DefaultTokenServices tokenServices;

public static void main(String[] args) 
    SpringApplication.run(Application.class, args); 
    //TODO comments


@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter 

    //@Autowired
    private AuthenticationManager authManager;

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() 
        return new JwtAccessTokenConverter();
    

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception 
        oauthServer.tokenKeyAccess("isAnonymous() || hasAuthority('ROLE_TRUSTED_CLIENT')")
                   .checkTokenAccess("hasAuthority('ROLE_TRUSTED_CLIENT')"); 
    

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        endpoints.authenticationManager(authManager).accessTokenConverter(accessTokenConverter());
    

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
        clients.inMemory()
        .withClient("my-trusted_client")
            .authorizedGrantTypes("password", "authorization_code", "refresh_token", "implicit")
            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
            .scopes("read", "write", "trust")
            .accessTokenValiditySeconds(60)
        .and()
        .withClient("my-client-with-registered-redirect")
            .authorizedGrantTypes("authorization_code")
            .authorities("ROLE_CLIENT")
            .scopes("read", "trust")
            .redirectUris("http://anywhere?key=value")
        .and()
        .withClient("my-client-with-secret")
            .authorizedGrantTypes("client_credentials", "password")
            .authorities("ROLE_CLIENT", "ROLE_TRUSTED_CLIENT")
            .scopes("read", "write")
            .secret("secret");
    

我不确定工作流程如何。我猜:前端访问 /oauth/authorization 端点以授权其令牌,然后 Spring 后端必须在每次请求资源时检查 JWT-Token 是否有权访问该资源?正确的?那么,当请求 REST 端点时,我如何告诉 Spring 检查令牌?我已经尝试过

@RequestMapping("/projects")
@PreAuthorize("oauthClientHasRole('ROLE_CLIENT')")
public String getProjects() 
    return "";

但它似乎不起作用。

【问题讨论】:

【参考方案1】:

您可以查看新的spring-cloud-samples 的sso 示例。对我来说,这是了解它是如何完成的最好的示例。

此外,一旦您开始了解它,您可以阅读this tutoiral,它更具技术性并且更多地了解如何使用 RSA 非对称密钥对。

【讨论】:

以上是关于如何使用 Spring OAuth2 JWT 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在spring security oauth2授权服务器中通过jwt令牌获取用户信息?

如何在 Spring Boot OAuth2 的 SecurityContextHolder 中获取 JWT 令牌?

Spring Boot OAuth2 资源服务器:库如何在没有公钥的情况下验证 JWT 令牌?

使用 OAuth2 保护服务,JWT 令牌不起作用 Spring Cloud

Spring Webflux SecurityValidate OAuth2 JWT 令牌

Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器