Spring Security oAuth 2.0 UAA 自动获取令牌值

Posted

技术标签:

【中文标题】Spring Security oAuth 2.0 UAA 自动获取令牌值【英文标题】:Spring Security oAuth 2.0 UAA get token value authomatically 【发布时间】:2018-03-29 02:23:45 【问题描述】:

我正在做一个我需要的项目,不仅要进行身份验证,还要获得令牌的真正价值。

我们有一个带有 oAuth2.0 Spring Security 的 Spring Boot 应用程序,问题是我无法找到一种方法,每次调用它时都会给我一个有效的令牌。

此时,我有一个用 Java 编码的 post 方法,但必须有一个 Spring Security 实现,它执行以下操作:

    第一次调用时,它会请求令牌并存储它。 以下时间检查令牌是否已过期,如果已过期,它会要求一个新的。

我在哪里可以找到它?

编辑

我的项目中有 2 个不同的 Spring 实例:授权服务器 - 它是 Cloud Foundry UAA 服务器 - 和资源服务器 - 请求令牌并由我编码。

授权服务器在 JWT 版本中使用 AuthorizationServerTokenServices,当资源服务器从那里获取令牌时,我希望保留它,而不仅仅是解码和使用,因为我需要将其发送到另一台服务器。

此外,我的应用程序不是 Web 应用程序,因此在 Facebook 上没有登录页面,我必须使用 Client Credentials Grant Type 获取令牌。

就我而言,单点登录是不可能的,因为我必须使用它而不是解码。

这是我当前的实现:

public String obtainAccessToken() throws ClientProtocolException, IOException 
        HttpClient httpclient = HttpClients.createDefault();

        String userPass64 = new String("User and password");

        HttpPost httppost = new HttpPost("localhost:8080/uaa/oauth/token?grant_type=client_credentials");       
        httppost.setHeader("Content-Type", "application/x-www-form-urlencoded");
        httppost.setHeader("Authorization", "Basic " + userPass64);

        //Execute and get the response.
        HttpResponse response = httpclient.execute(httppost);
        String responseBody = EntityUtils.toString(response.getEntity());

        ObjectMapper mapper = new ObjectMapper();
        TokenMessage tokenMessage = mapper.readValue(responseBody, TokenMessage.class);

        return tokenMessage.getAccess_token();
    

【问题讨论】:

“自动” - 我喜欢你在那里所做的 :) “我需要将其发送到另一台服务器”是什么意思?您是否尝试从此服务器访问另一个受保护的资源? 【参考方案1】:

据我所知,Spring 安全性可以通过几种不同的方式来处理这个问题。

默认方式是让 AuthorizationServerTokenServices 接口处理它。有了它,您可以有不同的方式来存储令牌。例如 JDBCTokenStoreInMemoryTokenStoreJwtTokenStore。更多关于这里的信息:http://projects.spring.io/spring-security-oauth/docs/oauth2.html#managing-tokens

但是由于我不知道您正在创建什么样的应用程序,您可以开发一个单点登录功能并让 Facebook 例如处理身份验证令牌。可以在这里找到关于 Spring boot 的相当好的教程:https://spring.io/guides/tutorials/spring-boot-oauth2/

【讨论】:

非常感谢您的快速回复。我没有正确解释。我有一个架构,其中授权服务器(A Cloud Foundry UAA)与资源服务器分开。 AuthorizationServerTokenServices 与授权服务器有关,但我也想将其存储在资源服务器中。我的应用程序的问题在于它不是 Web 应用程序,因此没有登录页面可以登录 Facebook,我必须使用 Client Credentials Grant Type 获取令牌。因此,我认为单点登录是不可能的。

以上是关于Spring Security oAuth 2.0 UAA 自动获取令牌值的主要内容,如果未能解决你的问题,请参考以下文章

spring-security-oauth2.0 SSO大体流程图

Spring Security 5 OAuth 2.0 ResourceServer 如何与 AuthorizationServer 通信?

使用 Spring Security 的 OAuth 2.0 中的 resourceId 是啥意思

Spring security OAuth 2.0 的一个简单解释

如何将 Spring Security OAuth 2.0 客户端存储配置到数据库

Spring Security oAuth 2.0 UAA 自动获取令牌值