【问题标题】:Spring - oauth2 - exchange authorization code for refresh and access tokensSpring - oauth2 - 交换刷新和访问令牌的授权代码
【发布时间】:2018-02-03 15:21:43
【问题描述】:

我想用 Spring oauth2 客户端包交换刷新和访问令牌的授权代码。我的代码如下:

public static void main(String[] args) {

  AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();
  resource.setUserAuthorizationUri("http://localhost:8080/oauth/authorize");
  resource.setAccessTokenUri("http://localhost:8080/oauth/token");
  resource.setClientId("my-client-with-secret");
  resource.setClientSecret("secret");

  AccessTokenRequest request = new DefaultAccessTokenRequest();
  request.setAuthorizationCode("o9subu");

  AuthorizationCodeAccessTokenProvider provider = new AuthorizationCodeAccessTokenProvider();
  OAuth2AccessToken accessToken = provider.obtainAccessToken(resource, request);

  System.out.println(accessToken.getValue());
}

提供程序来自https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/approval,当我直接调用提供程序时,我已经从浏览器中获取了临时 oauth2 代码。

错误信息是

线程 "main" error="invalid_request", error_description="检测到可能的 CSRF - 需要状态参数但找不到状态" 在 org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.getParametersForTokenRequest(AuthorizationCodeAccessTokenProvider.java:255) 在 org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeAccessTokenProvider.obtainAccessToken(AuthorizationCodeAccessTokenProvider.java:209)

我还是想自己申请access_token和secret_token,因为我是从其他系统获取的oauth2代码。

【问题讨论】:

    标签: java spring spring-security oauth


    【解决方案1】:

    首先,要获得 refresh_token,您必须有一个 code 让您获得它,然后设置 "&access_type=offline&approval_prompt= force" 在您发送以获取 代码 的 url 内。 然后你可以要求 refresh_token 设置这个参数

    code=your_code_generated
    client_id=your_client_id
    client_secret=your_client_secret
    redirect_uri=https://oauth2.example.com/code
    grant_type=authorization_code
    
    POST https://accounts.google.com/o/oauth2/token
    

    您可以在 Google Identity Platform https://developers.google.com/identity/protocols/OAuth2WebServer 中查看更多详细信息

    【讨论】:

      【解决方案2】:

      在设置的授权码后面简单添加这一行:

      request.setPreservedState(new Object());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2014-10-12
        • 2015-06-12
        • 2017-09-23
        • 2017-08-07
        • 2015-03-30
        • 2019-06-06
        相关资源
        最近更新 更多