如何通过Spring Boot访问需要OAuth2的外部URL?

时间:2018-05-04 08:49:21

标签: java spring spring-boot oauth-2.0 spring-security-oauth2

目前,我们用于对需要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):

  1. 在Spring Boot微服务(2.0.1.RELEASE)中,如何使用Spring Security或仅使用HttpClient来使用clientId,clientSecret和grant_type在每个REST调用中自动提供全局访问令牌(可能来自REST控制器层的HTTP Post)?

  2. 有人可以展示如何使用Spring Security或其他库来发送clientId,clientSecret和grant_type以获取OAuth2访问令牌的代码示例吗?

  3. 如果OAuth2令牌过期,该怎么做(使用问题#2中的库)?

3 个答案:

答案 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返回用户。

此致

R Rai

答案 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);

非常简单!