没有ClientId的Spring OAuth2令牌和外部客户端的ClientSecret

时间:2017-02-12 16:51:36

标签: spring oauth spring-security-oauth2

我们使用Spring生成OAuth令牌,它接受用户名/密码/ ClientId / Secret,这非常有效。对于外部客户端,我们只需输入用户名和密码并生成OAuth令牌。

<security:http pattern="/oauth/token" create-session="stateless"
        authentication-manager-ref="clientAuthenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" />
        <security:anonymous enabled="false" />
    <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <!-- include this only if you need to authenticate clients via request parameters -->
        <security:custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
  </security:http>

以下是我们需要添加的新代码,但它要求在浏览器中输入用户名和密码。

<security:http pattern="/**external**/oauth/token" create-session="stateless"
        authentication-manager-ref="clientAuthenticationManager"
        xmlns="http://www.springframework.org/schema/security">
        <security:intercept-url pattern="/external/oauth/token" access="IS_AUTHENTICATED_FULLY" />
        <security:anonymous enabled="false" />
    <security:http-basic entry-point-ref="clientAuthenticationEntryPoint" />
        <security:custom-filter ref="clientCredentialsTokenEndpointFilter" after="BASIC_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
  </security:http>

请指导我们是否可以在没有clientId的情况下生成OAuth,并在内部传递clientId以生成OAuth。

2 个答案:

答案 0 :(得分:2)

如果没有clientId,您永远不能生成OAuth令牌! Oauth2有3种创建令牌,隐式,代码和用户/通道的方法。应该避免使用最后一个,因为这意味着Oauth客户端将可以访问用户的凭据,并且构建OAuth是为了防止这种情况发生。仅使用用户凭证(通常仅涉及浏览器)授予隐式令牌。在代码模式下,OAuth客户端收到一个代码(不应该在浏览器中),然后将其交换到令牌。令牌交换的代码要求Oauth客户端使用它的clientId和密码进行身份验证,这通常使用基本身份验证来完成。

答案 1 :(得分:1)

我认为您需要的是资源所有者密码授予类型,在https://tools.ietf.org/html/rfc6749#section-1.3.3

中有解释

资源所有者密码授予类型只应与受信任的客户端一起使用。因此,如果您正在谈论的外部客户端是受信任的客户端(就像由同一家公司开发的原生移动应用程序。例如Facebook移动应用程序),可以使用它。

流程在https://tools.ietf.org/html/rfc6749#section-4.3.1

中解释

资源所有者授权类型最重要的方面是客户端不应存储用户名和密码。