引文:DefaultTokenService作为oauth2中操作token(crud)的默认实现,在oauth2框架中有着很重要的地位。 本文主要讲解其基于redis的方式实现。
一. 首先,DefaultTokenService中持有TokenStore接口用于保存token。用redis保存可使用redisTokenStore。
二. token的种类:在产生token的过程中会产生以下几种类型的token: 1.Access(key为access+oauth通过uuid生成的token字符串,对应的value为OAuth2AccessToken,checktoken时会用到) .
2.Auth(key为Auth+oauth通过uuid生成的token字符串,对应的value为OAuth2Authentication(包含pricipal(name),criedtials,Authorities(权限)),checktoken时会用到)
3.Auth_to_access(key是name和client_id通过md5加密生成的字符串,对应的value为OAuth2AccessToken,请求token时会用到) 4.Refresh_to_access(key为refreshtoken的值,value为accesstoken的值,刷新token时用于通过refreshtoken找到accesstoken的桥梁,一遍删除老的accesstoken)
5.Access_to_Refresh(key为accesstoken的值,value为refreshtoken的值)
6.Refresh(key为refresh+oauth通过uuid生成的refreshtoken字符串,对应的value为OAuth2RefreshToken,refreshtoken时会用到) 7.Refresh_Auth(key为refresh_auth+oauth通过uuid生成的refreshtoken字符串,对应的value为OAuth2Authentication,refreshtoken时会用到)
三.createAccessToken解析: 1.首先读取Auth_to_access(申请token时会传来name和client_id,通过MD5加密得到Auth_to_access的key,从而获取到OAuth2AccessToken)
2.如果OAuth2AccessToken不存在,说明缓存中不存在token。这时需进行一系列产生token的步骤。首先.生成OAuth2RefreshToken和OAuth2AccessToken(OAuth2RefreshToken设置在其内部)。然后调用tokenStore的storeAccessToken方法,存储Access,存储Auth,存储Auth_to_access,存储Refresh_to_access,存储Access_to_Refresh。接着再调用tokenStore的storeRefreshToken方法,存储Refresh,存储Refresh_Auth。
3.接上第一步,如果OAuth2AccessToken存在(且未过期),直接返回改token。
四.check token解析:
1.首先读取ACCESS的OAuth2AccessToken,然后再读取Auth的OAuth2Authentication,最后通过accessTokenConverter将OAuth2Authentication中的user信息提取出来。
五.refresh token解析: 1.1首先读取refresh的OAuth2RefreshToken。
2.通过refresh获取refresh_auth的OAuth2Authentication.
3.通过refreshtoken获取Refresh_to_access的value(accesstoken的值)然后删掉该accesstoken。
4.创建新的accessToken(上述步骤三)