spring-oauth-server 数据库表说明 v3.0.0

以下对spring-oauth-server项目中的 oauth.ddl initial_db.ddl文件(位于/others/database目录)中的表字及段进行说明, 内容包括字段说明与使用场景等

表名 字段名 字段类型 字段说明
oauth2_registered_client id varchar 主键,系统自动生成
archived tinyint 用于标识客户端是否已存档(即实现逻辑删除),默认值为'0'(即未存档).
对该字段的具体使用请参考CustomJdbcClientDetailsService.java,在该类中,扩展了在查询client_details的SQL加上archived = 0条件 (扩展字段)
create_time datetime 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
updated_time timestamp 数据的最后更新时间,由数据库自行更新维护
client_id varchar 唯一,不能为空.
用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务端自动生成).
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appKey,与client_id是同一个概念.
client_id_issued_at timestamp client_id的签发时间, 默认为数据创建时间
client_secret varchar 用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成),加密保存.
对于不同的grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念.
client_secret_expires_at datetime client_secret的过期时间,null表示永不过期
client_name varchar 客户端(client)的名称,一般是一个有业务意义的名称
client_authentication_methods varchar 认证支持的方式,多个由逗号分隔; 如: client_secret_basic,client_secret_post; 一般指认证时传递client_secret支持哪些方式
authorization_grant_types varchar 指定客户端支持的grant_type,可选值包括authorization_code,urn:ietf:params:oauth:grant-type:device_code,refresh_token, urn:ietf:params:oauth:grant-type:jwt-bearer,client_credentials, 若支持多个grant_type用逗号(,)分隔,如: "authorization_code,refresh_token".
在实际应用中,当注册时,该字段是一般由服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有: "authorization_code,refresh_token"(针对通过浏览器访问的客户端); "client_credentials"(针对另一个服务端的场景,不需要用户参与).
urn:ietf:params:oauth:grant-type:device_codeurn:ietf:params:oauth:grant-type:jwt-bearer是OAuth2.1中新增.
redirect_uris varchar OAuth2 认证后回调uri, 一般传递code, 多个由逗号分隔; 可为空, 当grant_type为authorization_code时, 在OAuth的流程中会使用并检查与注册时填写的redirect_uri是否一致. 下面分别说明:
  • 当grant_type=authorization_code时, 第一步 从 spring-oauth-server获取 'code'时客户端发起请求时必须有redirect_uri参数, 该参数的值必须与 web_server_redirect_uri的值一致. 第二步 用 'code' 换取 'access_token' 时客户也必须传递相同的redirect_uri.
    在实际应用中, redirect_uris在注册时是必须填写的, 一般用来处理服务器返回的code, 验证state是否合法与通过code去换取access_token值.
    spring-oauth-client项目中, 可具体参考AuthorizationCodeController.java中的authorizationCodeCallback方法.
post_logout_redirect_uris varchar OAuth2 退出时 post 的客户端重定向 uri; 可选 多个由逗号分隔, 一般在client注册时可填写
scopes varchar 指定客户端申请的权限范围,可选值在OIDC协议中定义, 包括openid,profile,email,address,phone;若有多个值用逗号(,)分隔,如: "openid,email".
openid是必须有的,其他值若有则在获取的id_token中会包含对应的值.
在实际应该中, 该值一般由服务端指定, 常用的值为openid.
client_settings varchar 客户端的各类设置, 如是否支持PKCE,用户授权(consent)确认是否必须等; 详见代码ClientSettings.java; 此字段存储JSON格式的数据值.
token_settings varchar 对token的各类设置; 如 token有效期, refresh_token有效期等; 详见代码TokenSettings.java; 此字段存储JSON格式的数据值.

在项目中,主要操作oauth2_registered_client表的类是ClientDetailsController.java, OauthClientDetails.java更多的细节请参考该类; 也可以根据实际的需要,去扩展或修改该类的实现.

oauth2_authorization id varchar 主键
registered_client_id varchar 外键, 关联oauth2_registered_client的id字段
principal_name varchar 认证名称, 一般指用户名或clientId; 对应OIDC中的sub字段
authorization_grant_type varchar OAuth2的 grant_type 类型
authorized_scopes varchar 此次授权的范围(scope)
attributes blob 进行认证授权的各类信息,JSON格式
state varchar 认证请求中传递的 state 值
authorization_code_value blob authorization_code流程中的code
authorization_code_issued_at datetime authorization_code流程中的code签发时间
authorization_code_expires_at datetime authorization_code流程中的code过期时间
authorization_code_metadata blob authorization_code流程中的code的属性设置, 如值是否有效
access_token_value blob access_token 值
access_token_issued_at datetime access_token 签发时间
access_token_expires_at datetime access_token 过期时间
access_token_metadata blob access_token 属性设置, 如各类claims中的属性与值
access_token_type varchar access_token 类型, 一般是Bearer
access_token_scopes varchar 此次授权的scope范围值,如: openid,profile
oidc_id_token_value blob OIDC中id_token 值
oidc_id_token_issued_at datetime id_token 签发时间
oidc_id_token_expires_at datetime id_token 过期时间
oidc_id_token_metadata blob id_token 属性设置, 如各类claims中的属性与值
refresh_token_value blob refresh_token 值
refresh_token_issued_at datetime refresh_token 签发时间
refresh_token_expires_at datetime refresh_token 过期时间
refresh_token_metadata blob refresh_token 属性设置, 如是否复用(reuse)
user_code_value blob device_code流程中的user_code值
user_code_issued_at datetime user_code 签发时间
user_code_expires_at datetime user_code 过期时间
user_code_metadata blob user_code 属性设置, 如是否已经验证
device_code_value blob device_code流程中的device_code值
device_code_issued_at datetime device_code 签发时间
device_code_expires_at datetime device_code 过期时间
device_code_metadata blob device_code 属性设置, 如是否已经验证
updated_time timestamp 数据的最后修改时间, 由数据库自动维护更新

该表用于存储在OAuth2.1授权过程中各类信息数据, 支持各类grant_type场景; 对oauth2_authorization表的主要操作在JdbcOAuth2AuthorizationService.java类中, 更多的细节请参考该类.
注意: 若对性能有要求, 此表的数据存储设计需要进行优化(如存redis或利用JWT特性简化一些不必要的存储字段).

oauth2_authorization_consent registered_client_id varchar 外键, 关联oauth2_registered_client表的id字段
principal_name varchar 认证名称, 一般指用户名或clientId; 对应OIDC中的sub字段
authorities varchar 授权确认过期中的属性, 如scope范围
updated_time timestamp 数据的最后修改时间, 由数据库自动维护更新

该表主要存储在授权过程中需要用户进行确认(consent)的信息; 在项目中,主要操作oauth2_authorization_consent表的对象是JdbcOAuth2AuthorizationConsentService.java. 更多的细节请参考该类.

oauth_refresh_token create_time 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id 该字段的值是将refresh_token的值通过MD5加密后存储的.
token 存储将OAuth2RefreshToken.java对象序列化后的二进制数据.
authentication 存储将OAuth2Authentication.java对象序列化后的二进制数据.

在项目中,主要操作oauth_refresh_token表的对象是JdbcTokenStore.java. (与操作oauth_access_token表的对象一样);更多的细节请参考该类.
如果客户端的grant_type不支持refresh_token,则不会使用该表.

oauth_code create_time 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
code 存储服务端系统生成的code的值(未加密).
authentication 存储将AuthorizationRequestHolder.java对象序列化后的二进制数据.

在项目中,主要操作oauth_code表的对象是JdbcAuthorizationCodeServices.java. 更多的细节请参考该类.
只有当grant_type为"authorization_code"时,该表中才会有数据产生; 其他的grant_type没有使用该表.

© 2013 - 2023 spring-oauth-server