spring-oauth-server/others/db_table_description_3.0.0....

341 lines
15 KiB
HTML
Raw Normal View History

2023-10-18 13:23:48 +00:00
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>数据库表说明(oauth.ddl)</title>
<link href="https://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
</head>
<body>
<div class="container-fluid">
<h2>spring-oauth-server 数据库表说明
<small class="badge" title="Version">v3.0.0</small>
</h2>
<p class="text-muted">以下对<a target="_blank"
href="https://gitee.com/shengzhao/spring-oauth-server">spring-oauth-server</a>项目中的
<code>oauth.ddl</code> <code>initial_db.ddl</code>文件(位于/others/database目录)中的表字及段进行说明,
内容包括字段说明与使用场景等</p>
<table class="table table-bordered table-hover">
<thead>
<tr>
<th style="width:10%;">表名</th>
<th style="width: 10%">字段名</th>
<th>字段类型</th>
<th>字段说明</th>
</tr>
</thead>
<tbody>
<tr>
<td rowspan="17">oauth2_registered_client</td>
<td>id</td>
<td>varchar</td>
<td>主键,系统自动生成</td>
</tr>
<tr>
<td>archived</td>
<td>tinyint</td>
<td>
用于标识客户端是否已存档(即实现逻辑删除),默认值为'0'(即未存档).
<br/>
对该字段的具体使用请参考<code>CustomJdbcClientDetailsService.java</code>,在该类中,扩展了在查询client_details的SQL加上<em>archived
= 0</em>条件 (扩展字段)
</td>
</tr>
<tr>
<td>create_time</td>
<td>datetime</td>
<td>数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)</td>
</tr>
<tr>
<td>updated_time</td>
<td>timestamp</td>
<td>数据的最后更新时间,由数据库自行更新维护</td>
</tr>
<tr>
<td>client_id</td>
<td>varchar</td>
<td>
唯一,不能为空.
<br/>
用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务端自动生成).
<br/>
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appKey,与client_id是同一个概念.
</td>
</tr>
<tr>
<td>client_id_issued_at</td>
<td>timestamp</td>
<td>client_id的签发时间, 默认为数据创建时间</td>
</tr>
<tr>
<td>client_secret</td>
2023-10-18 13:24:53 +00:00
<td>varchar</td>
2023-10-18 13:23:48 +00:00
<td>
用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成),加密保存.
<br/>
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念.
</td>
</tr>
<tr>
<td>client_secret_expires_at</td>
<td>datetime</td>
<td>client_secret的过期时间,null表示永不过期</td>
</tr>
<tr>
<td>client_name</td>
<td>varchar</td>
<td>客户端(client)的名称,一般是一个有业务意义的名称</td>
</tr>
<tr>
<td>client_authentication_methods</td>
<td>varchar</td>
<td>认证支持的方式,多个由逗号分隔; 如: client_secret_basic,client_secret_post; 一般指认证时传递client_secret支持哪些方式</td>
</tr>
<tr>
<td>authorization_grant_types</td>
<td>varchar</td>
<td>
指定客户端支持的grant_type,可选值包括<em>authorization_code</em>,<em>urn:ietf:params:oauth:grant-type:device_code</em>,<em>refresh_token</em>,
<em>urn:ietf:params:oauth:grant-type:jwt-bearer</em>,<em>client_credentials</em>,
若支持多个grant_type用逗号(,)分隔,如: "authorization_code,refresh_token".
<br/>
在实际应用中,当注册时,该字段是一般由服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有:
"authorization_code,refresh_token"(针对通过浏览器访问的客户端);
"client_credentials"(针对另一个服务端的场景,不需要用户参与).
<br/>
<em>urn:ietf:params:oauth:grant-type:device_code</em><em>urn:ietf:params:oauth:grant-type:jwt-bearer</em>是OAuth2.1中新增.
</td>
</tr>
<tr>
<td>redirect_uris</td>
<td>varchar</td>
<td>
OAuth2 认证后回调uri 一般传递code, 多个由逗号分隔;
可为空, 当grant_type为<code>authorization_code</code>时,
在OAuth的流程中会使用并检查与注册时填写的redirect_uri是否一致. 下面分别说明:
<ul>
<li>
当grant_type=<code>authorization_code</code>时, 第一步 <code>从 spring-oauth-server获取
'code'</code>时客户端发起请求时必须有<code>redirect_uri</code>参数, 该参数的值必须与
<code>web_server_redirect_uri</code>的值一致. 第二步 <code>用 'code' 换取 'access_token'</code>
时客户也必须传递相同的<code>redirect_uri</code>.
<br/>
在实际应用中, <em>redirect_uris</em>在注册时是必须填写的, 一般用来处理服务器返回的<code>code</code>,
验证<code>state</code>是否合法与通过<code>code</code>去换取<code>access_token</code>值.
<br/>
<a href="https://gitee.com/mkk/spring-oauth-client">spring-oauth-client</a>项目中,
可具体参考<code>AuthorizationCodeController.java</code>中的<code>authorizationCodeCallback</code>方法.
</li>
</ul>
</td>
</tr>
<tr>
<td>post_logout_redirect_uris</td>
<td>varchar</td>
<td> OAuth2 退出时 post 的客户端重定向 uri; 可选 多个由逗号分隔, 一般在client注册时可填写</td>
</tr>
<tr>
<td>scopes</td>
<td>varchar</td>
<td>
指定客户端申请的权限范围,可选值在OIDC协议中定义,
包括<em>openid</em>,<em>profile</em>,<em>email</em>,<em>address</em>,<em>phone</em>;若有多个值用逗号(,)分隔,如: "openid,email".
<br/>
openid是必须有的,其他值若有则在获取的<code>id_token</code>中会包含对应的值.
<br/>
在实际应该中, 该值一般由服务端指定, 常用的值为<em>openid</em>.
</td>
</tr>
<tr>
<td>client_settings</td>
<td>varchar</td>
<td>
客户端的各类设置, 如是否支持PKCE用户授权(consent)确认是否必须等; 详见代码<code>ClientSettings.java</code>;
此字段存储JSON格式的数据值.
</td>
</tr>
<tr>
<td>token_settings</td>
<td>varchar</td>
<td>
对token的各类设置; 如 token有效期, refresh_token有效期等; 详见代码<code>TokenSettings.java</code>;
此字段存储JSON格式的数据值.
</td>
</tr>
<tr>
<td colspan="3">
<p class="text-info">
<em class="glyphicon glyphicon-info-sign"></em> 在项目中,主要操作<code>oauth2_registered_client</code>表的类是<code>ClientDetailsController.java</code>,
<code>OauthClientDetails.java</code>更多的细节请参考该类; 也可以根据实际的需要,去扩展或修改该类的实现.
</p>
</td>
</tr>
<!-- oauth2_authorization -->
<tr>
<td rowspan="7">oauth2_authorization</td>
<td>create_time</td>
<td>数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)</td>
</tr>
<tr>
<td>token_id</td>
<td>
从服务器端获取到的<code>access_token</code>的值.
</td>
</tr>
<tr>
<td>token</td>
<td>
这是一个二进制的字段, 存储的数据是<code>OAuth2AccessToken.java</code>对象序列化后的二进制数据.
</td>
</tr>
<tr>
<td>authentication_id</td>
<td>
该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的.
<br/>
具体实现请参考<code>DefaultClientKeyGenerator.java</code>类.
</td>
</tr>
<tr>
<td>user_name</td>
<td>登录时的用户名</td>
</tr>
<tr>
<td>client_id</td>
<td></td>
</tr>
<tr>
<td colspan="2">
<p class="text-info">
<em class="glyphicon glyphicon-info-sign"></em> 该表用于在客户端系统中存储从服务端获取的token数据,
<a href="http://git.oschina.net/shengzhao/spring-oauth-server">spring-oauth-server</a>项目中未使用到.
<br/>
<code>oauth_client_token</code>表的主要操作在<code>JdbcClientTokenServices.java</code>类中, 更多的细节请参考该类.
</p>
</td>
</tr>
<!-- oauth_access_token -->
<tr>
<td rowspan="9">oauth_access_token</td>
<td>create_time</td>
<td>数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)</td>
</tr>
<tr>
<td>token_id</td>
<td>
该字段的值是将<code>access_token</code>的值通过MD5加密后存储的.
</td>
</tr>
<tr>
<td>token</td>
<td>
存储将<code>OAuth2AccessToken.java</code>对象序列化后的二进制数据, 是真实的AccessToken的数据值.
</td>
</tr>
<tr>
<td>authentication_id</td>
<td>
该字段具有唯一性, 其值是根据当前的username(如果有),client_id与scope通过MD5加密生成的.
具体实现请参考<code>DefaultAuthenticationKeyGenerator.java</code>类.
</td>
</tr>
<tr>
<td>user_name</td>
<td>登录时的用户名, 若客户端没有用户名(如grant_type="client_credentials"),则该值等于client_id</td>
</tr>
<tr>
<td>client_id</td>
<td></td>
</tr>
<tr>
<td>authentication</td>
<td>
存储将<code>OAuth2Authentication.java</code>对象序列化后的二进制数据.
</td>
</tr>
<tr>
<td>refresh_token</td>
<td>
该字段的值是将<code>refresh_token</code>的值通过MD5加密后存储的.
</td>
</tr>
<tr>
<td colspan="2">
<p class="text-info">
<em class="glyphicon glyphicon-info-sign"></em> 在项目中,主要操作<code>oauth_access_token</code>表的对象是<code>JdbcTokenStore.java</code>.
更多的细节请参考该类.
</p>
</td>
</tr>
<!-- oauth_refresh_token -->
<tr>
<td rowspan="5">oauth_refresh_token</td>
<td>create_time</td>
<td>数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)</td>
</tr>
<tr>
<td>token_id</td>
<td>
该字段的值是将<code>refresh_token</code>的值通过MD5加密后存储的.
</td>
</tr>
<tr>
<td>token</td>
<td>
存储将<code>OAuth2RefreshToken.java</code>对象序列化后的二进制数据.
</td>
</tr>
<tr>
<td>authentication</td>
<td>
存储将<code>OAuth2Authentication.java</code>对象序列化后的二进制数据.
</td>
</tr>
<tr>
<td colspan="2">
<p class="text-info">
<em class="glyphicon glyphicon-info-sign"></em> 在项目中,主要操作<code>oauth_refresh_token</code>表的对象是<code>JdbcTokenStore.java</code>.
(与操作<code>oauth_access_token</code>表的对象一样);更多的细节请参考该类.
<br/>
如果客户端的grant_type不支持<code>refresh_token</code>,则不会使用该表.
</p>
</td>
</tr>
<!-- oauth_code -->
<tr>
<td rowspan="4">oauth_code</td>
<td>create_time</td>
<td>数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)</td>
</tr>
<tr>
<td>code</td>
<td>
存储服务端系统生成的<code>code</code>的值(未加密).
</td>
</tr>
<tr>
<td>authentication</td>
<td>
存储将<code>AuthorizationRequestHolder.java</code>对象序列化后的二进制数据.
</td>
</tr>
<tr>
<td colspan="2">
<p class="text-info">
<em class="glyphicon glyphicon-info-sign"></em> 在项目中,主要操作<code>oauth_code</code>表的对象是<code>JdbcAuthorizationCodeServices.java</code>.
更多的细节请参考该类.
<br/>
只有当grant_type为"authorization_code"时,该表中才会有数据产生; 其他的grant_type没有使用该表.
</p>
</td>
</tr>
</tbody>
</table>
<p class="text-muted">
&copy; 2013 - 2023 <a href="https://gitee.com/shengzhao/spring-oauth-server" target="_blank">spring-oauth-server</a>
</p>
</div>
</body>
</html>