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 接口处理它。有了它,您可以有不同的方式来存储令牌。例如 JDBCTokenStore、InMemoryTokenStore 和 JwtTokenStore。更多关于这里的信息: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 的一个简单解释