当前位置: 首页 > 知识库问答 >
问题:

重定向到访问令牌入口点Oauth令牌时出现问题

濮阳靖
2023-03-14

我在重定向到访问令牌入口点/oauth/token时遇到问题,这将在下面详述。我希望有人能给我一些光,因为我花了很多时间来实现这一点。

另外,有趣的是,即使按照他们的说明,我也无法使用SoapUI 5.0社区版进行测试。它设置了授权代码,但稍后会失败,因为您需要将重定向URI设置为“urn:ietf:wg:oauth:2.0:oob”。

因为Spring-Security-Oauth2缺少很多好的文档,而且我花了很多时间调试和记录这些工作,所以我决定在这里分享我的评论和配置代码,这可能对其他人也有帮助。

我在pom上使用了以下依赖项版本:

<org.springframework-version>4.0.5.RELEASE</org.springframework-version>
<org.springframework.security-version>3.2.5.RELEASE</org.springframework.security-version>
<org.springframework.security.oauth2-version>2.0.3.RELEASE</org.springframework.security.oauth2-version>

现在,我们的想法是使用Cassandra作为持久性存储来实现所有的clientId对象、UserPrincipal、access、nonce和token存储。所有这些组件都运行良好,并经过测试。事实上,它获取所有的认证/授权,创建授权代码。

我最近在Spring Oauth2 github上测试JDBC商店时看到了一个错误,但这与测试有关,而不是实际的实现,特别是因为不使用JDBC。

我已经编写了一个客户端Web应用程序来访问REST资源,该资源驻留在OAuth2服务器和Spring Security中以进行登录。一切顺利,直到我去请求访问令牌到 /oauth/token。

当我第一次点击安全Rest服务时,它正确地开始进行重定向,并执行tru defaultoauth 2 requestfactory createAuthorizationRequest()方法。用存储中的秘密etc完美地加载ClientDetails对象。因此它拥有Oauth2客户机的所有作用域、授权等。它还正确验证redirectURIParameter并解析重定向。然后,它转到TokenStoreUserApprovalHandler并创建OAuth2Request对象。然后,当然,会尝试查找工作流中尚不存在的现有访问令牌。它从authenticationKeyGenerator创建authenticationkey,并查询此时正确返回null的存储。然后,当它第二次在approveOrDeny()方法中有了授权代码并标记为approved (AuthorizationEndPoint)时,它重定向回/oauth/authorize两次。authorizationCodeServices创建代码并将其正确存储在我的Cassandra存储中。

此时,它调用(< code > authorization endpoint )< code > getSuccessfulRedirect(),将状态参数添加到模板中。

然后它调用 (OAuth2RestTemplate 类) getAccessToken() 方法。由于访问令牌是好的和有效的,然后调用 acquireAccessToken(), 它返回一个 accessTokenRequest,其中 {code=[Q19Y6u], state=[1PyzHf]} 。然后,它调用 accessTokenProvider 以获取 getAccessToken() 上的访问令牌。然后调用 OAuth2AccessTokenSupportretrieveToken() 方法中调用。并且在 getRestTemplate 上失败。AuthorizationCodeResourceDetails是使用授权类型authorization_code完美创建的,并且它具有authalesSchemeclientAuthenticationScheme作为标头。客户端 Id 作为客户端机密是正确的。AuthorizationCodeResourceDetails的id是oAuth2ClientBeanuserAuthorizationURI是 http://myhost.com:8080/MyAPI/oauth/authorize。页眉显示为

{Authorization=[Basic .....]}

提取器为org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport。形式为{grant_type=[authorization_code], code=[Xc7yni],redirect_uri=[http://myhost.com:8080/OAuthClient/support]}

然后应用程序冻结并显示在日志中:

DEBUG: org.springframework.security.authentication.DefaultAuthenticationEventPublisher - No event was found for the exception org.springframework.security.authentication.InternalAuthenticationServiceException
DEBUG: org.springframework.security.web.authentication.www.BasicAuthenticationFilter - Authentication request for failed: org.springframework.security.authentication.InternalAuthenticationServiceException

然后,我的客户端web应用程序出现了以下异常:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is error="access_denied", error_description="Error requesting access token."
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)

现在,我认为我对OAuth2和Spring Security的xml配置有一些问题。因此配置文件如下。

我确实有几个关于它的问题,所以首先是这些问题:

1)<代码>

<oauth2:authorization-server client-details-service-ref="webServiceClientService" 
    token-services-ref="tokenServices" user-approval-page="/oauth/userapproval" 
    error-page="/oauth/error" authorization-endpoint-url="/oauth/authorize" 
    token-endpoint-url="/oauth/token" user-approval-handler-ref="userApprovalHandler" 
    redirect-resolver-ref="resolver">
    <oauth2:authorization-code
        authorization-code-services-ref="codes" />
    <oauth2:implicit/>
    <oauth2:refresh-token/>
    <oauth2:client-credentials/>
    <oauth2:password authentication-manager-ref="userAuthenticationManager"/>
    <!-- <oauth2:custom-grant token-granter-ref=""/> -->
</oauth2:authorization-server>

2) 身份验证管理器 oauthClientAuthenticationManager 在拦截“/oauth/token”时使用。其定义如下:

<sec:authentication-manager id="oauthClientAuthenticationManager">
    <sec:authentication-provider user-service-ref="clientDetailsUserService">
        <sec:password-encoder ref="passwordEncoder" />
    </sec:authentication-provider>
</sec:authentication-manager>

3)我有以下方法SecurityExpressionHandler bean定义,用于sec:global-method-security。不确定这是否正确。

<beans:bean id="methodSecurityExpressionHandler"
        class="org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler" />

4) 我还有一个bean“clientCredentialsTokenEndpointFilter”,我认为这是不推荐的。我使用它作为入口点“/oauth/token”的自定义过滤器,但我认为这是错误的。

<beans:bean id="clientCredentialsTokenEndpointFilter" class="org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter">
    <beans:property name="authenticationManager" ref="oauthClientAuthenticationManager"/>
</beans:bean>
A filter and authentication endpoint for the OAuth2 Token Endpoint. Allows clients to authenticate using request
parameters if included as a security filter, as permitted by the specification (but not recommended). It is
recommended by the specification that you permit HTTP basic authentication for clients, and not use this filter at
all.

5)现在是Oauth令牌endpoint:这是endpoint/Oauth/令牌,因为我在这里有许多问题:

    < li >这是永远达不到的。 < li >我是否应该有像< code > clientcredentialstokendpointfilter 这样的自定义筛选器? < li >我必须有一个http-basic入口点吗? < li >我是否应该拥有< code > IS _ AUTHENTICATED _ FULLY 中的访问属性,或者我是否可以使用我在< code>UserPrincipal对象上定义的权限,例如我在那里添加的< code>OAUTH_CLIENT? < li >会议怎么样?我应该说“无国籍”还是“从未” < li >要不要把< code>corsFilter也加进去? < li >入口点是否正确?哪个是< code > oauth 2 authenticationentrypoint 类? < li >我必须添加csrf令牌吗?我不相信,因为它会限制它更多。 < li >表达式处理程序作为< code > org . spring framework . security . oauth 2 . provider . expression . oauth 2 websecurityexpressionhandle 是否正确? < Li > authentic ation-manager-ref I可以从< code > oauthClientAuthenticationManager 更改为< code > useauthenticationmanager 。

我想在这里添加完整的配置文件,但有一个限制。


共有1个答案

容磊
2023-03-14

/oauth/tokenendpoint应该使用客户端凭据进行保护,看起来您将其连接到了用户身份验证管理器。您没有显示它的配置或实现,但从<code>InternalAuthenticationServiceException

(顺便说一句,@Configuration样式更方便,我建议您开始使用它以及它提供的更多默认设置,直到您掌握了它的窍门。)

 类似资料:
  • null 很抱歉太啰嗦了。 提前谢了。

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 我使用postMan,输入请求地址http://localhost:8011/umrah/oauth/token?client_id=client_2&username=1234567&password=123456&grant_type=password&client_secret=123456,点击send按钮,出现错误,在内存中工作正常,当我想使用Jdbc令牌存储时,想法控制台错误:找不到令

  • 在一个脚本中,我试图用oauth令牌克隆Github存储库。 根据本教程: https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth 我应该能够像这样为它构建一个命令: 如果我使用正确的访问令牌手动尝试此操作,它仍会询问我的密码。 如果我在命令行上尝试它,我只是得到一个没有找到

  • 我遇到了很多文章,很多文章建议使用OAuth over API密钥。据我所知,在OAuth中,我们最终获得了访问令牌,它的有效期为很多天。例如,QuickBooks online OAuth令牌的有效期为6个月。 因此,访问令牌等同于API Key。无论谁得到它,都应该像API密钥一样保护它。OAuth调用应该通过HTTPS进行,类似于基于API Key的调用。 相对于OAuth的另一个优势是授权

  • 我知道有些人会发表评论,比如这篇文章重复了很多问题,但是我已经尝试了很多方法来在领英Oauth中实现访问令牌。解释我所尝试的。 1)我正在关注它的官方文档LinkedIn Oauth2 2) 我已成功从步骤 2 获取授权代码,并将该代码传递给步骤 3,以交换身份验证代码以获取访问令牌。但是我收到以下错误{“error_description”:“缺少必需参数,包含无效的参数值,参数不止一次。 :无