小编典典

使用Java中的Apache OAuth客户端2.0库生成授权代码和用户令牌的问题

java

我试图使用Java中的Apache OAuth Client 2.0 Library自动执行用户级别令牌创建/生成过程(REST
/授权授予代码)。以下是我从https://cwiki.apache.org/confluence/display/OLTU/OAuth+2.0+Client+Quickstart获得的正在使用的代码,

`/*Previous Codes & starting the below with Try/Catch*/
OAuthClientRequest request = OAuthClientRequest
   .authorizationLocation("Authorization URL")
   .setClientId("ClientID")
   .setRedirectURI("Redirect URL")
   .buildQueryMessage();
request.getLocationUri();
OAuthAuthzResponse oar = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
String code = oar.getCode();
/*Other Codes and starting the below with Try/Catch*/
OAuthClientRequest request = OAuthClientRequest
                .tokenLocation("TokenEndPointURL")
                .setGrantType(GrantType.AUTHORIZATION_CODE)
                .setClientId("ClientID")
                .setClientSecret("ClientSecret")
                .setRedirectURI("REdirectURL")
                .setCode(code)//Authorization Code from above
                .buildQueryMessage();
OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
GitHubTokenResponse oAuthResponse = oAuthClient.accessToken(request, GitHubTokenResponse.class);
String accessToken = oAuthResponse.getAccessToken();
String expiresIn = oAuthResponse.getExpiresIn();`

但是,我在以下几行中收到了(来自Eclipse中错误的推断)编译错误,

oauthCodeAuthzResponse方法接受httpservlet对象,并且不支持OAuthAuthzReponse Type

OAuthAuthzResponse oar = OAuthAuthzResponse.oauthCodeAuthzResponse(request);

有人可以让我知道是否有解决方法吗?或如何将oauthCodeAuthzResponse请求转换为httpservlet请求?还是我做错了什么或缺少什么?


阅读 452

收藏
2020-11-30

共1个答案

小编典典

OAuthAuthzResponse oar = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
String code = oar.getCode();

我认为上面的代码应该写在重定向URI端点的实现中,而不是在客户端代码中。

正确理解授权码流将有所帮助。一个 授权码
从授权服务器的授权端点发行,它被传递到由重定向URI指向的位置。也就是说,授权代码不会直接传递给客户端应用程序。

当授权服务器发出授权代码时,它将如下所示的HTTP响应发送回客户端的Web浏览器。

HTTP/1.1 302 Found
Location: {Redirect URI}
  ?code={Authorization Code}  // - Always included
  &state={Arbitrary String}   // - Included if the authorization
                              //   request included 'state'.

302 Found触发Web浏览器转到Location标题所指向的位置。因此,您必须实现接收授权代码的位置,并且实现必须以某种方式将授权代码传递给客户端应用程序。

还要注意,在(a)授权请求(=对授权端点的请求)和(b)令牌请求(=对令牌端点的请求)之间显示授权页面(HTML),并且该页面需要最终用户相互作用。有关详细信息,请参见“
所有OAuth 2.0流程的图表和影片 ”中的“ 1.授权代码流程” 。

2020-11-30