我们使用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。
答案 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
中解释资源所有者授权类型最重要的方面是客户端不应存储用户名和密码。