目前,我们用于对需要OAuth2的服务器进行身份验证的机制是编写一个包含main()方法的Java程序,该方法运行HttpClient以使用此调用生成OAuth2访问令牌:
https://api.externalsite.com/v1/oauth/token?clientId=iLHuXeULFBdW4B1dmRY0MhFILRQnlfeK&clientSecret=RG3JanXEq2R1GhRvIQ2d2AKRx0SORvb3&grant_type=client_credentials
这将返回以下JSON有效内容:
{
"access_token": "eyJhbGciOi786I1NiJ9.eyJ1c2VybmFtZSI6bnVsbCwiZGV2aWNlSWQiOm51bGwsImNsaWVudElkIjoiaUxIdVhlVUxGQmRXNEIxZG1SWTBNaFJPTVJRbmxmZUsiLCJhZElkIjpudWxsLCJleHAiOjE1MjU0MjY4LMYsImlhdCI6MTUyNTQyMzE0Nn0.Zz_uhXqOF2ykC24mNBWHnQ_Vmx-jfQs3X4qcmmN0-Sk",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": null,
"scope": null
}
获取访问令牌后,我们可以使用JSON针对授权网站/服务运行查询。
问题(S):
在Spring Boot微服务(2.0.1.RELEASE)中,如何使用Spring Security或仅使用HttpClient来使用clientId,clientSecret和grant_type在每个REST调用中自动提供全局访问令牌(可能来自REST控制器层的HTTP Post)?
有人可以展示如何使用Spring Security或其他库来发送clientId,clientSecret和grant_type以获取OAuth2访问令牌的代码示例吗?
如果OAuth2令牌过期,该怎么做(使用问题#2中的库)?
答案 0 :(得分:0)
1)你不需要弹簧安全。只需使用'io.jsonwebtoken.Jwts'。 您可以使用任意数量的参数来生成JWT令牌。 您可以使用Spring启动应用程序中的组件生成JWT令牌。
然后创建一个将使用此bean并执行的令牌服务:生成访问令牌,验证访问令牌并刷新令牌。
2) 样品: @零件 public String createJwtToken(User user,TokenType type,ClientKey clientKey)抛出InvalidKeyException,NoSuchAlgorithmException,NoSuchPaddingException,IllegalBlockSizeException,BadPaddingException {
String userName = user.getUsername();
Date currentTime = new Date();
String token = Jwts.builder()
.setSubject(userName)
.claim(Constants.NAME_KEY, Constants.NAME_VALUE)
.claim(Constants.USER_TOKEN_KEY, clientKey.getKey())
.claim(Constants.SCOPE_KEY, Constants.SCOPE_VALUE)
.claim(Constants.TOKEN_TYPE, type.name())
.setIssuer(tokenIssuer)
.setHeaderParam(Constants.TOKEN_TYP, Constants.TOKEN_JWT)
.setHeaderParam(Constants.TOKEN_TYPE, type.name())
.setIssuedAt(currentTime)
.setExpiration(timeout(type))
.signWith(SignatureAlgorithm.HS256, key)
.compact();
return encrypt(token);
}
3)每当您第一次生成令牌时,您将生成2个令牌:accessToken和Refresh Token。 AccessToken很短暂,很快就会到期。 - 说5分钟。 刷新令牌有一个临时到期时间:例如:20分钟。
刷新令牌的目的是您可以使用刷新令牌生成新的访问令牌。 因此,当您的访问令牌过期时,只需通过传递您的刷新令牌来调用刷新令牌方法。此方法应该使用新的访问令牌从redis返回用户。
此致
答案 1 :(得分:0)
找到一个由IBM开源并提供的OAuth2Client:
https://www.ibm.com/developerworks/library/se-oauthjavapt1/index.html#download
答案 2 :(得分:0)
另外,刚刚使用了RestTemplate:
String accessToken = OAuth2Client.generateAccessToken();
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer "+accessToken);
HttpEntity<String> entity = new HttpEntity<String>(request,headers);
String response = restTemplate.postForObject(url, entity, String.class);
非常简单!