【问题标题】:How to access external URL which requires OAuth2 via Spring Boot?如何通过 Spring Boot 访问需要 OAuth2 的外部 URL?
【发布时间】:2018-10-14 16:51:15
【问题描述】:

目前,我们用于对需要 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 对授权的网站/服务运行查询。


问题:

  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 中的库)?

【问题讨论】:

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


    【解决方案1】:

    1) 你不需要spring security。只需使用'io.jsonwebtoken.Jwts'。 您可以使用任意数量的参数来生成 JWT 令牌。 您可以在 Spring Boot 应用程序中使用组件来生成 JWT 令牌。

    然后创建一个令牌服务,它将使用这个 bean 并执行:生成访问令牌,验证访问令牌并刷新令牌。

    2) 样本 : @零件 public String createJwtToken(User user, TokenType type, ClientKey clientKey) throws 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 - 您的代码示例在 Eclipse 中给了我很多问题。我没有用户,也不知道常量的包导入来自哪里。我只需要找到一个可以获取 client_id、client_secret 和 grant_type = client_credentials 的 Java 库。不知道TokenType、ClientKey、tokenIssuer应该放什么?
    • 您正在代表某个实体生成令牌。它可能是一个用户,它可能是一个组织,也可能是一个系统标识符。我只是给你一个用户的例子。
    • 常量,只需创建一个类来存储静态值: public class Constants {public static final String TOKEN_TYP = "typ";公共静态最终字符串 TOKEN_JWT = "JWT";公共静态最终字符串 TOKEN_TYPE = "TOKEN_TYPE";公共静态最终字符串 USER_TOKEN_KEY = "USER_KEY";公共静态最终 TimeUnit TOKEN_TIMEUNIT = TimeUnit.MINUTES; public static final String NAME_KEY = "name";公共静态最终字符串 NAME_VALUE = "COMPAN"; TokenType、ClientKey 和 tokenIssuer 只是用来生成你的 token 的参数。您可以将这些替换为您需要的任何参数。
    【解决方案2】:

    找到一个由 IBM 开源并提供的 OAuth2Client:

    https://www.ibm.com/developerworks/library/se-oauthjavapt1/index.html#download

    【讨论】:

      【解决方案3】:

      另外,刚刚使用了 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);
      

      非常简单!

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 2018-09-11
        • 2020-11-21
        • 2020-10-25
        • 2018-12-01
        • 2016-10-06
        • 2018-05-03
        • 2015-10-28
        相关资源
        最近更新 更多