Spring Seurity系列(二十二)OAuth2服务提供商核心源码了解
2018-08-02 14:42
597 查看
Spring Security Oauth2核心源码:
/oauth/token的请求会被 TokenEndpoint拦截获取ClientDetails,并一起封装在TokenRequest中。
然后会调用TokenGranter:
CompositeTokenGranter#grant
[code] //四种授权模式+刷新令牌的模式根据grant_type判断 public OAuth2AccessToken grant(String grantType, TokenRequest tokenRequest) { for (TokenGranter granter : tokenGranters) { OAuth2AccessToken grant = granter.grant(grantType, tokenRequest); if (grant!=null) { return grant; } } return null; }
AbstractTokenGranter#getAccessToken
[code]protected OAuth2AccessToken getAccessToken(ClientDetails client, TokenRequest tokenRequest) { return tokenServices.createAccessToken(getOAuth2Authentication(client, tokenRequest)); }
DefaultTokenServices#createAccessToken
[code]public OAuth2AccessToken createAccessToken(OAuth2Authentication authentication) throws AuthenticationException { //从tokenStore获取OAuth2AccessToken (如果令牌存在,不同的授权模式下将返回同一个令牌) OAuth2AccessToken existingAccessToken = tokenStore.getAccessToken(authentication); OAuth2RefreshToken refreshToken = null; //判断是否过期 if (existingAccessToken != null) { if (existingAccessToken.isExpired()) { if (existingAccessToken.getRefreshToken() != null) { //删除过期的令牌 refreshToken = existingAccessToken.getRefreshToken(); // The token store could remove the refresh token when the // access token is removed, but we want to // be sure... tokenStore.removeRefreshToken(refreshToken); } tokenStore.removeAccessToken(existingAccessToken); } else { //如果令牌存在则从新存储一下 // Re-store the access token in case the authentication has changed tokenStore.storeAccessToken(existingAccessToken, authentication); //存储完直接返回 return existingAccessToken; } } // Only create a new refresh token if there wasn't an existing one // associated with an expired access token. // Clients might be holding existing refresh tokens, so we re-use it in // the case that the old access token // expired. //判断刷新令牌不存在 if (refreshToken == null) { //创建刷新令牌 refreshToken = createRefreshToken(authentication); } // But the refresh token itself might need to be re-issued if it has // expired. else if (refreshToken instanceof ExpiringOAuth2RefreshToken) { //过期 ExpiringOAuth2RefreshToken expiring = (ExpiringOAuth2RefreshToken) refreshToken; if (System.currentTimeMillis() > expiring.getExpiration().getTime()) { refreshToken = createRefreshToken(authentication); } } //根据刷新令牌创建OAuth2AccessToken OAuth2AccessToken accessToken = createAccessToken(authentication, refreshToken); tokenStore.storeAccessToken(accessToken, authentication); // In case it was modified refreshToken = accessToken.getRefreshToken(); if (refreshToken != null) { tokenStore.storeRefreshToken(refreshToken, authentication); } //返回OAuth2AccessToken return accessToken; }
说明:本系列博客是记录慕课网中的教程的学习,以便我自己复习回忆。文中涉及的一些细节问题请参考慕课网中相关视频。
贴出慕课网视频教程地址: http://coding.imooc.com/class/134.html
借鉴博客:借鉴博客
阅读更多相关文章推荐
- Spring应用、原理以及粗读源码系列(一)--框架总述、以Bean为核心的机制(IoC容器初始化以及依赖注入)
- 【开源系列】三国演义LBS (八)源码:核心框架:数据库建模
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- Silverlight实用窍门系列:34.Silverlight中不得不了解使用的依赖属性【附带源码实例】
- linux 命令系列之 基于源码包安装服务的启动(67)
- Tomcat源码解读系列——Tomcat的核心组成和启动过程
- jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween
- spring-security-oauth2核心类源码解析
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
- jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
- PureMVC学习系列-从源码深度剖析PureMVC(核心组件工作流程及原理)
- Mahout系列之推荐引擎核心源码
- zabbix 监控服务系列之--------NO1源码包安装篇
- zepto源码系列一之核心$()
- jQuery-1.9.1源码分析系列(十六)ajax——ajax处理流程以及核心函数
- Liferay 6.2 改造系列之一:源码编译和服务启动
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
- 打印服务知识系列8--常用但你不一定了解的打印设置
- 4.Tornado源码必须要读的几个核心文件----了解Tornado的大致工作机制