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 使用从请求标头获取的令牌,而不是请求身份验证服务器
带有预取 JWT 令牌的 OAuth2RestTemplate
将 OAuth2RestTemplate 公开为 AsyncRestTemplate