首页 文章

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

提问于
浏览
0

目前,我们用于对需要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调用中自动提供全局访问令牌(可能是HTTP Post)从REST控制器层?

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

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

3 回答

  • 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);
    

    很容易!

  • 0

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

    然后创建将使用此bean并执行的令牌服务:生成访问令牌,验证访问令牌并刷新令牌 .

    2)示例:@Component 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

  • 0

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

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

相关问题