当前位置: 首页 > 知识库问答 >
问题:

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

潘坚白
2023-03-14

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

问题:

>

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

    有人能展示一下如何使用Spring Security或其他库来发送clientId、clientSecret和grant_类型以获取OAuth2访问令牌的代码示例吗?

    如果库352的问题到期352如何使用??

  • 共有3个答案

    梁浩
    2023-03-14

    此外,刚刚使用了RestTemboard:

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

    很简单!

    陆伟
    2023-03-14

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

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

    毋树
    2023-03-14

    1) 你不需要Spring安全。用io就行了。jsonwebtoken。Jwts'。可以使用任意数量的参数来生成JWT令牌。您可以使用Spring boot应用程序中的组件来生成JWT令牌。

    然后创建一个令牌服务,该服务将使用这个bean并执行以下操作:生成访问令牌、验证访问令牌和刷新令牌。

    2) 示例:@Component public String createJwtToken(用户用户、TokenType类型、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是短暂的,很快就会到期。-比如说5分钟。刷新令牌的到期时间更长:例如:20分钟。

    刷新令牌的用途是,您可以使用刷新令牌生成新的访问令牌。因此,当您的访问令牌过期时,只需通过传递您的刷新令牌来调用刷新令牌方法。此方法应使用新的访问令牌从redis返回用户。

    当做

    R莱

     类似资料:
    • 我在Kubernetes集群中配置了Keycloak(10.0.3)服务器。 问题是,当我试图访问我的web应用程序时,它总是重定向到'http://keycloak-cluster-http.keycloak-cluster.svc.cluster.local/auth/realms/myrealm',这在K8S之外无法解决。 如果我将issuiser-uri更改为http://keycloak

    • 这是我正在研究的一个更大问题的一个简短的子问题。 为什么我不能通过第8行outer class中的inner class的实例访问outer类字段? 字段在内部类中可见。 外部类中的非静态方法仍然存在此问题。 字段的可见性并不重要。无论从哪种方式,它都可以从内部类中看到。 可以通过内部类中的(私有)getter访问该字段,但我出现问题的原因之一是,我希望避免这些。 它应该成为不可变的构建器模式的一

    • 下面是静态嵌套类

    • 我正在尝试使用有关brew的说明安装Hashcat:https://brewinstall.org/install-hashcat-on-Mac-with-brew/ 当我在终端上输入第一个命令:ruby-e“$(curl-fssl https://raw.githubusercontent.com/homebrew/install/master/install)”/dev/null时,它表示:m

    • 问题内容: 是否可以从Java内部类中获取对它的引用? 即 问题答案: 您可以像这样访问外部类的实例:

    • 问题内容: 我的问题是关于ReentrantLock的使用是否可以保证字段的可见性(与synced关键字提供的方面相同)。 例如,在以下类 A中 ,由于使用了 synced关键字 ,因此无需将 sharedData 字段声明为volatile。 对于下一个使用ReentrantLock的示例,该字段上的volatile关键字是否必要? 我知道无论如何使用volatile关键字都只会对性能造成微不足