代码:https://gitee.com/forgot940629/ssov2
授权服务
登录成功后,session中会存储UsernamePasswordAuthenticationToken,之后每次请求code时都会用UsernamePasswordAuthenticationToken生成OAuth2Authentication,并将OAuth2Authentication和code建立映射关系,并将映射关系存储到AuthorizationCodeServices。获取令牌时,根据code获取OAuth2Authentication,然后根据OAuth2Authentication生成令牌并返回给client。令牌中包含用户id 客户端id 过期时间 access_token等信息
http流程
请求 | 服务 | 简介 | cookie | set-cookie | Location | 备注 |
---|---|---|---|---|---|---|
GET /client2 | 客户端 | 访问接口 | -- | -- | -- | 目前暂不清楚起始阶段为啥有两次/client2 |
GET /client2 | 客户端 | 访问接口 | -- | 设置sessionid1 | /client2/login | |
GET /client2/login | 客户端 | sessionid1 | -- | /uaa/oauth/authorize | ||
GET /uaa/oauth/authorize | sso服务 | 尝试获取授权码 | -- | 设置sessionid2 | /uaa/authentication/require | |
GET /uaa/authentication/require | sso服务 | 返回登录页面 | sessionid2 | -- | -- | |
POST /uaa/authentication/form | sso服务 | 提交登录信息 | sessionid2 | 设置sessionid3 | /uaa/oauth/authorize | |
GET /uaa/oauth/authorize | sso服务 | 尝试获取授权码 | sessionid3 | -- | /client2/login | |
GET /client2/login | 客户端 | sessionid1 | 设置sessionid4 | /client2 | ||
GET /client2 | 客户端 | sessionid4 |
http详细交互流程
访问服务
重定向/client2/login
第一次尝试获取授权码
获取登录页面
提交登录信息
第二次尝试获取授权码
重定向/client2/login
访问资源
session&重定向
某些响应中Location设置了重定向地址,这个地址存储在session中。整个登录流程虽然sessionid涉及四个之多,但实际上可以将其归纳为两个session,一个是客户端的session,一个是sso服务的session。
客户端session中存储的是用户最初的访问链接,在此例中就是http://127.0.0.1:8084/client2
sso服务session中存储的是http://127.0.0.1:8084/client2/login
数据结构
记录关键数据结构,便于断点调试
维护sessionid和session的映射关系:org.apache.catalina.session.ManagerBase
session对象,对象中保存session各种属性:org.apache.catalina.session.StandardSession
请求:org.apache.catalina.connector.Request
响应:org.apache.catalina.connector.Response
org.apache.catalina.connector.CoyoteOutputStream#write(byte[], int, int)将返回信息刷到输出流中
令牌生成/刷新/获取:AuthorizationServerTokenServices
jwt加密:org.springframework.security.jwt.JwtHelper#encode(java.lang.CharSequence, org.springframework.security.jwt.crypto.sign.Signer)
org.springframework.security.oauth2.provider.code.InMemoryAuthorizationCodeServices#authorizationCodeStore中保存code和令牌所需信息之间的映射关系
sso的session中存储登录信息:org.apache.catalina.session.StandardSession#attributes的SPRING_SECURITY_CONTEXT中存储着UsernamePasswordAuthenticationToken
org.springframework.security.oauth2.provider.code.AuthorizationCodeServices授权码相关服务,负责生成code和根据code获取OAuth2Authentication