Spring OAuth 2呼叫/ oauth /令牌导致401(未经授权)

时间:2015-07-23 13:10:38

标签: spring-security-oauth2

问候所有人,我尝试通过Spring Security OAuth配置简单的授权代码流。

我通过以下方法测试了我的授权和资源服务器配置:

  1. 创建一个Web应用程序作为客户端,并使用其页面将http post调用发送到/ oauth / authorize。
  2. 获取代码后,我使用相同的页面 使用代码触发另一个http帖子并获取令牌。
  3. 最后,我用 curl -H将标记置于标题内并从受保护的方式获取响应 资源。
  4. 但是当我尝试使用rest模板时。它抛出错误消息401 Unauthorized error。

    服务器端 - 安全配置:

    <http auto-config="true" pattern="/protected/**"
        authentication-manager-ref="authenticationManager">
        <custom-filter ref="resourceFilter" before="PRE_AUTH_FILTER" />
        <csrf disabled="true" />
    </http>
    
    <http auto-config="true">
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login default-target-url="/admin.html" />
        <logout logout-success-url="/welcome.html" logout-url="/logout"/>
        <csrf disabled="true" />
    </http>
    
    <authentication-manager alias="authenticationManager">
        <authentication-provider>
            <user-service>
                <user name="admin" password="123456" authorities="ROLE_USER,ROLE_ADMIN" />
            </user-service>
        </authentication-provider>
    </authentication-manager>
    

    服务器端 - 授权和资源配置:

    <oauth:authorization-server
        client-details-service-ref="clientDetails" error-page="error">
        <oauth:authorization-code />
    </oauth:authorization-server>
    
    <oauth:client-details-service id="clientDetails">
        <oauth:client client-id="admin" secret="fooSecret" />
    </oauth:client-details-service>
    
    <oauth:resource-server id="resourceFilter" />
    

    客户端:

    <oauth:client id="oauth2ClientContextFilter" />
    <oauth:resource id="sso" client-id="admin"
        access-token-uri="http://localhost:8080/tough/oauth/token"
        user-authorization-uri="http://localhost:8080/tough/oauth/authorize"
        use-current-uri="true" client-secret="secret"
        client-authentication-scheme="header" type="authorization_code"
        scope="trust" />
    <oauth:rest-template id="template" resource="sso"/>
    

    如果有人知道哪里出了问题,请告诉我。

2 个答案:

答案 0 :(得分:1)

Phew ......我解决了问题。上面的配置存在两个问题。

  1. 我注意到我的客户端使用了错误的秘密来与授权服务器通信。
  2. 授权服务器上的令牌端点使用认证管理器 提供用户认证。结果 客户端一直被拒绝,直到我创建新的安全领域 令牌端点并将其配置为使用为其设计的身份验证管理器 客户端。
  3. 注意客户端与用户不同。客户端是第三方想要访问属于您的用户的资源(也称为资源所有者)。希望以上帮助

    :)干杯

答案 1 :(得分:0)

我遇到了同样的问题。它有助于添加

    org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService 

弹出证书身份验证管理器,将clientDetailsS​​ervice粘贴到身份验证管理器。所以

    <authentication-manager alias="authenticationManager">
      ...
      <authentication-provider user-service-ref="clientDetailsUserDetailsService"/>
      ...
    </authentication-manager>
几乎为我解决了这个问题。我还有一个问题:由于ClientDetailsUserDetailsS​​ervice没有默认构造函数,因此spring抛出了表单的异常

    org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class
    [class org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService]:
    Common causes of this problem include using a final class or a non-visible class;
    nested exception is java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

如果不使用接收clientDetailsS​​ervice作为属性而不是构造函数arg的类的副本,我无法解决。