Spring - oauth2 - 用于刷新和访问令牌的交换授权代码

时间:2017-08-25 14:30:42

标签: java spring spring-security oauth

我想用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,当我直接致电提供商时,我已从浏览器中获取了temp 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代码。

2 个答案:

答案 0 :(得分:0)

首先,要获得 refresh_token ,你必须有一个代码才能让你获得它,为此设置“& access_type =离线& approval_prompt =强制“在您发送的网址中以获取代码。 然后,您可以要求 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身份平台https://developers.google.com/identity/protocols/OAuth2WebServer

中查看更多详细信息

答案 1 :(得分:0)

在设置授权码后简单添加此行:

request.setPreservedState(new Object());