Spring安全中的Oauth2客户端

Posted

技术标签:

【中文标题】Spring安全中的Oauth2客户端【英文标题】:Oauth2 Client in Spring security 【发布时间】:2016-10-31 07:14:46 【问题描述】:

我很难找到使用 Spring 实现的 OAuth2 客户端的示例。

我有使用 Spring 实现的 OAuth2 授权和资源服务器。我想从该授权服务器获取访问令牌。我需要一个示例,如何仅使用客户端凭据从我的 OAuth2 服务器获取访问令牌。没有用户参与,只是我的客户端应用程序使用客户端凭据获取访问令牌,然后使用它来访问 客户端 资源。

我只找到了使用 Java 库的示例,但我认为 Spring 的 OAuth2 框架中对此提供了支持。

如果可能,示例应包含 OAuth2 客户端、OAuth2 授权服务器和 OAuth2 资源服务器,所有这些都使用自签名证书通过 TLS 进行通信,使用 Spring 实现,不使用 xml 配置。

这是时序图:

【问题讨论】:

【参考方案1】:

通过 Spring Security OAuth2 库获取访问令牌是相当简单的,如下所示的示例代码。在这种情况下,您需要的唯一依赖项是

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.1.0.RELEASE</version>
</dependency>

示例代码:

@Test
public void getAccessTokenViaSpringSecurityOAuthClient() 
    try

        ClientCredentialsResourceDetails resourceDetails = new ClientCredentialsResourceDetails();
        resourceDetails.setClientSecret(TestOAuthConstants.CLIENT_SECRET);
        resourceDetails.setClientId(TestOAuthConstants.CLIENT_ID);
        resourceDetails.setAccessTokenUri(TestOAuthConstants.TOKEN_REQUEST_URL);
        resourceDetails.setScope(TestOAuthConstants.SCOPES);

        OAuth2RestTemplate oAuthRestTemplate = new OAuth2RestTemplate(resourceDetails);

        org.springframework.http.HttpHeaders headers = new org.springframework.http.HttpHeaders();
        headers.setContentType( MediaType.APPLICATION_JSON );

        OAuth2AccessToken token = oAuthRestTemplate.getAccessToken();
        System.out.println(oAuthRestTemplate.getResource());
        System.out.println(oAuthRestTemplate.getOAuth2ClientContext());
        System.out.println(token);

        assertTrue(token != null);

     catch (Exception e) 
        e.printStackTrace();
    

【讨论】:

以上是关于Spring安全中的Oauth2客户端的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 2.0.3 + 安全 + Oauth2 自动配置

Spring 安全客户端详细信息将作为 DaoAuthenticationProvider 中的用户详细信息

Spring security oauth2 - 从 OAuth2 主体获取自定义数据

Spring OAuth2.0 - 动态注册 OAuth2.0 客户端

Spring Oauth2 客户端凭据流示例

Rest API 中的 Spring Security Oauth2