OAuth2RestTemplate 身份验证问题被拒绝访问

Posted

技术标签:

【中文标题】OAuth2RestTemplate 身份验证问题被拒绝访问【英文标题】:OAuth2RestTemplate authetication issue getting access_denied 【发布时间】:2016-03-15 13:00:26 【问题描述】:

通过使用以下 curl 命令,我可以访问令牌并获得以下响应 curl 用户名:password@machinename:11002/appName/oauth/token -d grant_type=password -d username=loginFormUserID -d password=loginFormUserPassword

响应: “实体 ID”:9, “实体类型”:“”, "refresh_token" : "eyJhbGciOiJSUzI1NiJ9.", “范围”:“登录”, “expires_in”:3599, “实体名称”:“名称”, “access_token”:“eyJhbGciOiJSUzI1NiJ9.ey”, “token_type”:“持票人”

如果我将使用 spring OAuth2RestTemplate 我将被拒绝访问,这是我的代码详细信息

    ResourceOwnerPasswordAccessTokenProvider provider = new ResourceOwnerPasswordAccessTokenProvider();
    ResourceOwnerPasswordResourceDetails resource = new ResourceOwnerPasswordResourceDetails();
    resource.setClientAuthenticationScheme(AuthenticationScheme.form);
    resource.setAccessTokenUri("http://machinename:11002/appName/oauth/token");
    resource.setClientId("loginFormUserID");
    resource.setClientSecret("loginFormUserPassword");
    resource.setGrantType("password");
    resource.setUsername("username");
    resource.setPassword("password");
    OAuth2AccessToken accessToken = provider.obtainAccessToken(resource, new DefaultAccessTokenRequest());
    OAuth2RestTemplate restTemplateQ     = new OAuth2RestTemplate(resource, new DefaultOAuth2ClientContext(accessToken));
    System.out.println( restTemplateQ.getAccessToken());

线程“main”中的异常 error="access_denied", error_description="Error requesting access token." 在 org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:145) 在 org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider.obtainAccessToken(ResourceOwnerPasswordAccessTokenProvider.java:47) 在 com.copart.g1.seller.middleware.client.RestTemplateTest.main(RestTemplateTest.java:55) 引起:org.springframework.web.client.HttpClientErrorException: 401 Unauthorized 在 org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 在 org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport$AccessTokenErrorHandler.handleError(OAuth2AccessTokenSupport.java:244) 在 org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) 在 org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) 在 org.springframework.web.client.RestTemplate.execute(RestTemplate.java:565) 在 org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:137) ... 2 更多

【问题讨论】:

【参考方案1】:

你需要删除 resource.setClientAuthenticationScheme(AuthenticationScheme.form); 正确的形式是 AuthenticationScheme.header

ResourceOwnerPasswordResourceDetails 类扩展了 BaseOAuth2ProtectedResourceDetails,如果你看到这个类的值是 AuthenticationScheme.header

谢谢

【讨论】:

以上是关于OAuth2RestTemplate 身份验证问题被拒绝访问的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2RestOperations 使用从请求标头获取的令牌,而不是请求身份验证服务器

如何设置 OAuth2RestTemplate(更新后)

带有预取 JWT 令牌的 OAuth2RestTemplate

将 OAuth2RestTemplate 公开为 AsyncRestTemplate

如何使用 OAuth2RestTemplate + Spring 4?

OAuth2RestTemplate 将字符集添加到内容类型标头中