我正在开发一个使用Spring Oauth2, password
flow保护的应用程序 .
但是我仍然对Spring中UserDetailService和ClientDetailsService流程之间的区别感到困惑 .
据我所知,从OAuth2规范来看,客户端和用户是不同的实体 . Client 有 clientId
, clientSecret
和一些 grants
, User 有 username
, password
还有一些 grants
.
多个用户使用相同的客户端(在我的情况下是移动应用程序或Web浏览器) .
所以我需要对一些用户进行身份验证并为其提供访问令牌 .
我已经实现了 UserDetailsService
和 ClientDetailsService
(包含所有需要的基础结构:AuthorizationServerConfigurerAdapter和ResourceServerConfigurerAdapter),并且在身份验证期间,我看到,请求中的用户名作为 clientId
传递到clientDetailsService,并作为 username
传递到userDetailsService .
但我认为它应该是更复杂的过程,如身份验证请求客户端应提供客户端凭据和用户凭据,以便我可以验证客户端(它是否在我的系统中注册),然后其授权然后验证用户及其授权,然后返回访问权限令牌 .
我的问题:
-
我是否正确理解了这个过程?
-
客户授予和用户授权是否具有相同的含义?
-
我应该自定义哪些类来分隔客户端和用户凭据的验证?
1 回答
解决方案很简单 .
客户端和用户实际上是不同的实体要获取访问令牌,您需要在头部和
username/password of the user in params
中使用Base64 encoded client credentials
完成基本身份验证 .标头伪代码:
Basic Base64("client_id:client_secret")
PARAMS:
username=username, password=password, grant_type=password
这将返回access_token,refresh_token和一些额外的信息 .