述
上文中,实现了认证服务器和资源服务器,四种 OAuth 的授权也可以使用了,但是现在仅限于 Spring Security OAuth 给出的4种授权模式,我们之前写的 用户名密码认证, 短信认证, 第三方社交账号认证,这都是不支持的, 那如何让我们自己写的认证方式也按照 OAuth 这样返回一个token, 下面首先来了解一下 Spring Security OAuth 的一些核心的代码
流程
如图(绿色部分是model, 蓝色部分是接口,以及他们各自的默认实现类)
TokenEndPoint
: 流程入口点, 用来处理获取令牌的请求ClientDeatilsService
: 读取第三方应用信息,根据传过来的clientId,读取client相应的一些配置信息ClientDetails
: 封装第三方应用的信息TokenRequest
: 封装了请求中的其他参数, 比如grant_type
,scope
等等,TokenRequest
包含了ClientDetails
TokenGranter
: 封装了4种授权模式的实现,根据grant_type
去找一个具体的实现, 执行完毕后会生成OAuthRequest
和Authentication
OAuthRequest
: 包含了ClientDetails
和TokenRequest
Authentication
: 封装的授权用户的信息,是通过UserdetailsService
查询出来的,最终OAuthRequest
和Authentication
会组成一个OAuth2Authentication
对象OAuth2Authentication
: 通过这个对象可以知道,是哪个用户在哪个应用请求授权,走的是哪种授权模式等等这些信息AuthorizationServerTokenServices
: 最终生成令牌的地方,这个对象引用了TokenStore
负责令牌的存取,还有TokenEnhancer
令牌的增强器,对生成之后的令牌做一些处理
源码
根据上面的流程一步一步去看一下代码, 首先是 TokenEndPoint
如下:
然后这个类最后会调用 TokenGranter
, 看下这个的代码:
这里也就是做了个验证,然后调用 AuthorizationServerTokenServices
代码如下:
这里才是真正创建token的地方, 然后创建token的方法是
整个大致的流程就是这样, 一些具体的代码可以自己点进去看一下