security oauth token生成过程
2020-05-18 10:54:41 0 举报
Security OAuth Token获取流程
作者其他创作
大纲/内容
createRefreshToken(authentication);
使用身份认证信息和refreshToken生成新的accessToken
不存在
校验时会遍历所有的AuthenticationProvider,并判断该provider是否支持该认证对象,如支持,则往下继续执行校验。注:provider可以通过实现AuthenticationProvider接口实现自定义
否
this.getUserDetailsService().loadUserByUsername(username);
对得到的Authentication进行判断
获取UserDetailsService,并使用用户名读取该用户信息
tokenStore.getAccessToken(authentication);
得到的token是否为null
发布身份校验成功事件
5个tokenGranter分别是1.授权码模式2.RefreshToken3.简单模式4.客户端模式5.密码模式
判断当前provider是否支持该认证对象(Authentication)
将token以及身份认证信息进行存储
获取TokenGranter并使用指定的授权类型和tokenRequest授予(生成)令牌,并得到OAuth2AccessToken对象
入口请求(获取token)/oauth/token
每个tokenGranter对应的生成操作都不一样,这里拿密码模式进行举例
authenticationManager.authenticate(userAuth);
如果支持,则使用该provider实现的authenticate()进行用户认证
refreshToken是否是ExpiringOAuth2RefreshToken的实现类
refreshToken是否为null
结束
如果不支持,则使用认证管理接口(AuthenticationManager)的认证方法进行校验(其实也就是ProviderManager.authenticate())使用的是DaoAuthenticationProvider
return accessToken;
存在
校验通过
provider.authenticate(authentication);
进行一系列校验
擦除Authentication对象中的密码
token是否过期
accessToken.getRefreshToken();
使用clientId获取ClientDetails
TokenStore使用得到的OAuth2Authentication生成accessToken
使用认证管理接口(AuthenticationManager)校验用户信息(即上一步生成的Authentication)
2.生成AccessToken
getClientDetailsService().loadClientByClientId(clientId)
为当前accessToken生成新的refreshToken
1.生成OAuth2Authentication对象
是
额外信息(注释)
this.userCache.putUserInCache(user);
用户身份信息(principal)是否只保留用户名
principalToReturn = user.getUsername();
使用用户身份信息、认证信息、UserDetails创建一个认证通过后的Authentication对象(UsernamePasswordAuthenticationToken)
curl -H \"Authorization:Basic dGVzdDp0ZXN0\" -X POST \"http://localhost:9999/auth/oauth/token?username=admin&password=vxQukUw6VlpGLBWuk2oL3w%3D%3D&grant_type=password&scope=server\"
得到的token是否为空
这里会遍历一个List<TokenGranter>,集合封装了5个产生令牌的操作(tokenGranter),会根据携带的grantType选择对应的tokenGranter进行accessToken的生成
创建refreshToken
加入缓存
不存在,则检索该用户
不支持
设置响应头,并结合响应头、token、响应状态码生成一个ResponseEntity
result = parentResult = parent.authenticate(authentication);
判断userAuth是否不为空且已完成校验
refreshToken是否过期
getClientId(principal);
preAuthenticationChecks.check(user);
其中:校验TokenRequest中所请求的scope是否存在于当前的客户端允许的scopes中
创建accessToken
进行身份校验,即:判断用户输入的密码是否为空,输入的密码是否与获取到的(UserDetails)密码匹配
font color=\"#ff0000\
使用client和tokenRequest创建OAuth2Request
TokenEndpoint
使用client和tokenRequest获取认证信息,然后再用该信息生成accessToken,并返回一个OAuth2AccessToken对象
通过
可以通过实现ClientDetailsService接口实现定制化
return existingAccessToken;
描述信息粉色字体的信息为可实现接口自定义的信息
判断当前client的认证授权类型是否包含该grantType
((CredentialsContainer) result).eraseCredentials();
移除accessToken
先从缓存中(UserCache)查看是否有该用户名的用户缓存(UserDetails)
获取clientId
重要步骤,会往下拆分进行解读
认证校验的后置处理,即:密码是否过期
xxx
org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
用户
进行认证校验前的预处理,即对UserDetails进行一系列判断(账号是否锁定、是否可用、是否过期)
refreshToken是否为空
将refreshToken以及身份认证信息进行存储
postAuthenticationChecks.check(user);
其实就是将tokenRequest中的参数将用户密码和客户端密码擦除,然后结合client信息构建一个OAuth2Request对象
默认不支持
使用request传递进来的参数(用户登录信息),和获取到的客户端详情构建TokenRequest
此处UserDetailsService可以通过实现UserDetailsService接口进行自定义
可以通过实现TokenStore接口实现定制化的token获取方法
return getResponse(token);
eventPublisher.publishAuthenticationSuccess(result);
使用storedOAuth2Request(就是上一步创建的OAuth2Request对象)和userAuth构建一个OAuth2Authentication对象至此,生成OAuth2Authentication对象结束
存储的操作也在TokenStore的实现类中完成
tokenServices.createAccessToken(font color=\"#ff0000\
根据具体的tokenStore进行获取
这分支开始是refreshToken更新accessToken的过程
主要流程
tokenStore中移除refreshToken
使用用户输入的账号密码生成认证信息(Authentication对象)
refreshToken(OAuth2RefreshToken)是否为null
该用户是否存在缓存中
this.userCache.getUserFromCache(username)
0 条评论
下一页