#yyds干货盘点#oauth2 授权服务器相关表的作用

枕上诗书闲处好,门前风景雨来佳。这篇文章主要讲述#yyds干货盘点#oauth2 授权服务器相关表的作用相关的知识,希望能为你提供帮助。
  当我们配置了 jdbc 之后。 就是说配置了把 授权码code、access_token、approval 之后,在做了响应的请求之后,oauth2 框架会记录 一些对应的信息到数据库中去。


具体来说,这些需要存储的信息分别对应:
存储授权码code 的为JwtTokenStore、  
存储用户授权动作信息为 JdbcApprovalStore、
存储access_token、refresh_token 的为JdbcAuthorizationCodeServices 、
存储客户端信息的为 JdbcClientDetailsService、  
存储客户端获取到的token的为 JdbcClientTokenServices、  




oauth_code表
每次 授权码方式访问 成功后, oauth_code 增加一行数据。 授权码使用过一次之后,删除对应的那一行。
不使用会一直保留。。
【#yyds干货盘点#oauth2 授权服务器相关表的作用】
注意其中:
expires_in 单位是秒。
code 的有效期是?一直, 直到使用,使用一次就被消费,就删除。


oauth_approvals表
每次授权动作后, oauth_approvals 增加一行数据;   注意,需要授权的动作是: 授权码方式访问,第一步的获取授权码code请求,简单/隐式模式 获取token的请求。 只有两个模式需要 授权。
oauth_approvals 只要存在一行, 就不会自动删除。不会再新增一行。

看一下 blob 的内容?发现是二进制的,非常不方便。只能通过程序的工具类来解码。
授权码方式访问的时候,第二步的获取token请求成功之后, oauth_client_token 就会增加一行数据
tokenid 是这个样的: 60aca9a51d9f50e9996c9ae7c8201e85,
token_id 是怎么创建的? 是md5编码后的结果;org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator#generateKey 及 extractKey   方法

authorization_id 呢?是
看起来像是一个uuid,
access_token 是怎么来的?org.springframework.security.oauth2.provider.token.DefaultAccessTokenConverter#extractAccessToken 方法



oauth_access_token表
oauth_access_token  它是每次oauth发放access_token 等之后会记录的,非常好观察。




oauth_client_token表
oauth_client_token 搜索半天没有看到其用法,后面发现是JdbcClientTokenServices 被调用,但是打了断点,没有跳进去。找到一篇文章是 https://github.com/spring-projects/spring-security-oauth/issues/194
the role of JdbcClientTokenServices:
the purpose here is for OAuth2 client applications to be able to save tokens that theyve obtained (on behalf of users, primarily) and to look up the right one when needed




oauth_client_details表
oauth_client_details 是客户端消息 ,  
每一次刷新 expires_in 都会减少,只要它大于0,那么返回相同的access_token, 即使授权服务器重启,因为它会从数据库读取,存在则不会重新生成。删除后 刷新请求,会立即重新生成, 此时就会删除旧的那行。。。 小于0 之后 access_token 失效, 会重新生成一个access_token


需要注意的是:
grant_type=client_credentials 返回是不同的 access_token;
grant_type=password 、 response_type=token、grant_type=authorization_code   是相同的! 可能是因为他们都存在 username, 登录过的, 不一样。
对于 grant_type=client_credentials , 不会有 refresh_token 





    推荐阅读