目 录CONTENT

文章目录

OAuth2-0中表结构以及字段说明

筱晶哥哥
2023-03-04 / 0 评论 / 0 点赞 / 46 阅读 / 14711 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

OAuth是Open Authorization的简写。OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。OAuth2.0是OAuth协议的延续版本,但不向前兼容(即完全废止了OAuth1.0)。

本文记录OAuth2.0中表结构以及字段说明。

SQL

DROP TABLE IF EXISTS `oauth_access_token`;

CREATE TABLE `oauth_access_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication_id` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `client_id` varchar(255) DEFAULT NULL,
  `authentication` longblob,
  `refresh_token` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_approvals`;

CREATE TABLE `oauth_approvals` (
  `userId` varchar(255) DEFAULT NULL,
  `clientId` varchar(255) DEFAULT NULL,
  `scope` varchar(255) DEFAULT NULL,
  `status` varchar(10) DEFAULT NULL,
  `expiresAt` datetime DEFAULT NULL,
  `lastModifiedAt` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_client_details`;

CREATE TABLE `oauth_client_details` (
  `client_id` varchar(255) NOT NULL,
  `resource_ids` varchar(255) DEFAULT NULL,
  `client_secret` varchar(255) DEFAULT NULL,
  `scope` varchar(255) DEFAULT NULL,
  `authorized_grant_types` varchar(255) DEFAULT NULL,
  `web_server_redirect_uri` varchar(255) DEFAULT NULL,
  `authorities` varchar(255) DEFAULT NULL,
  `access_token_validity` int(11) DEFAULT NULL,
  `refresh_token_validity` int(11) DEFAULT NULL,
  `additional_information` varchar(255) DEFAULT NULL,
  `autoapprove` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_client_token`;

CREATE TABLE `oauth_client_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication_id` varchar(255) DEFAULT NULL,
  `user_name` varchar(255) DEFAULT NULL,
  `client_id` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_code`;

CREATE TABLE `oauth_code` (
  `code` varchar(255) DEFAULT NULL,
  `authentication` varbinary(2550) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `oauth_refresh_token`;

CREATE TABLE `oauth_refresh_token` (
  `token_id` varchar(255) DEFAULT NULL,
  `token` longblob,
  `authentication` longblob
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表字段说明

oauth_client_details【核心表】

字段名字段说明
client_id主键,必须唯一,不能为空,用于唯一标识每一个客户端(client)
在注册时必须填写(也可由服务端自动生成)
对于不同的grant_type,该字段都是必须的
在实际应用中的另一个名称叫appKey,与client_id是同一个概念
resource_ids客户端所能访问的资源id集合,多个资源时用逗号分隔,如: "unity-resource,mobileresource"
该字段的值必须来源于与security.xml中标签oauth2:resource-server的属性resource-id值一致
在security.xml配置有几个oauth2:resource-server标签, 则该字段可以使用几个值
在实际应用中, 我们一般将资源进行分类,并分别配置对应的oauth2:resource-server,如订单资源配置一个oauth2:resource-server, 用户资源又配置一个oauth2:resource-server
当注册客户端时,根据实际需要可选择资源id,也可根据不同的注册流程,赋予对应的资源id
client_secret用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成). 对于不同的grant_type,该字段都是必须的
在实际应用中的另一个名称叫appSecret,与client_secret是同一个概念
scope指定客户端申请的权限范围,可选值包括read,write,trust
若有多个权限范围用逗号分隔,如:"read,write"
scope的值与security.xml中配置的‹intercept-url的access属性有关系
如intercept-url的配置为intercept-url pattern="/m/**" access="ROLE_MOBILE,SCOPE_READ"/>则说明访问该URL时的客户端必须有read权限范围
write的配置值为SCOPE_WRITE, trust的配置值为SCOPE_TRUST
在实际应该中, 该值一般由服务端指定, 常用的值为read,write
authorized_grant_types指定客户端支持的grant_type,可选值包括authorization_code,password,refresh_token,implicit,client_credentials, 若支持多个grant_type用逗号分隔,如: "authorization_code,password"
在实际应用中,当注册时,该字段是一般服务器端指定的,而不是由申请者去选择的,最常用的grant_type组合有:"authorization_code,refresh_token"(针对通过浏览器访问的客户端);"password,refresh_token"(针对移动设备的客户端)
implicit与client_credentials在实际中很少使用
web_server_redirect_uri客户端的重定向URI,可为空, 当grant_type为authorization_code或implicit时, 在Oauth的流程中会使用并检查与注册时填写的redirect_uri是否一致
下面分别说明:当grant_type=authorization_code时, 第一步 从 spring-oauth-server获取 'code’时客户端发起请求时必须有redirect_uri参数, 该参数的值必须与 web_server_redirect_uri的值一致
第二步 用 ‘code’ 换取 ‘access_token’ 时客户也必须传递相同的redirect_uri
在实际应用中,web_server_redirect_uri在注册时是必须填写的, 一般用来处理服务器返回的code, 验证state是否合法与通过code去换取access_token值
在spring-oauth-client项目中,可具体参考AuthorizationCodeController.java中的authorizationCodeCallback方法
当grant_type=implicit时通过redirect_uri的hash值来传递access_token值,然后客户端通过JS等从hash值中取到access_token值
authorities指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号分隔
access_token_validity设定客户端的access_token的有效时间值(单位:秒),可选, 若不设定值则使用默认的有效时间值(60 * 60 * 12, 12小时)
在服务端获取的access_token JSON数据中的expires_in字段的值即为当前access_token的有效时间值
在项目中, 可具体参考DefaultTokenServices.java中属性accessTokenValiditySeconds. 在实际应用中, 该值一般是由服务端处理的, 不需要客户端自定义
refresh_token_validity 设定客户端的refresh_token的有效时间值(单位:秒),可选,若不设定值则使用默认的有效时间值(60 * 60 * 24 * 30, 30天)
若客户端的grant_type不包括refresh_token,则不用关心该字段 在项目中, 可具体参考DefaultTokenServices.java中属性refreshTokenValiditySeconds
在实际应用中, 该值一般是由服务端处理的, 不需要客户端自定义
additional_information这是一个预留的字段,在Oauth的流程中没有实际的使用,可选,但若设置值,必须是JSON格式的数据,按照spring-security-oauth项目中对该字段的描述 Additional information for this client, not need by the vanilla OAuth protocolbut might be useful, for example,for storing descriptive information(详见ClientDetails.java的getAdditionalInformation()方法的注释)在实际应用中, 可以用该字段来存储关于客户端的一些其他信息,如客户端的国家,地区,注册时的IP地址等等
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
archived用于标识客户端是否已存档(即实现逻辑删除),默认值为’0’(即未存档)
对该字段的具体使用请参考CustomJdbcClientDetailsService.java,在该类中,扩展了在查询client_details的SQL加上archived = 0条件 (扩展字段)
trusted设置客户端是否为受信任的,默认为’0’(即不受信任的,1为受信任的)
该字段只适用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为0,则会跳转到让用户Approve的页面让用户同意授权, 若该字段为1,则在登录后不需要再让用户Approve同意授权(因为是受信任的),对该字段的具体使用请参考OauthUserApprovalHandler.java(扩展字段)
autoapprove设置用户是否自动Approval操作, 默认值为 ‘false’, 可选值包括 ‘true’,‘false’, ‘read’,‘write’
该字段只适用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为’true’或支持的scope值,则会跳过用户Approve的页面, 直接授权
该字段与 trusted 有类似的功能, 是spring-security-oauth2 的 2.0 版本后添加的新属性. 在项目中,主要操作oauth_client_details表的类是JdbcClientDetailsService.java, 更多的细节请参考该类,也可以根据实际的需要,去扩展或修改该类的实现

oauth_client_token

该表用于在客户端系统中存储从服务端获取的token数据, 在spring-oauth-server项目中未使用到

对oauth_client_token表的主要操作在JdbcClientTokenServices.java类中, 更多的细节请参考该类

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id从服务器端获取到的access_token的值
token这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据
authentication_id该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生成的
具体实现请参考DefaultClientKeyGenerator.java类
user_name登录时的用户名
client_id

oauth_access_token

字段名字段说明
create_time数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段)
token_id该字段的值是将access_token的值通过MD5加密后存储的
token存储将OAuth2AccessToken.java对象序列化后的二进制数据,是真实的AccessToken的数据值.
authentication_id该字段具有唯一性, 其值是根据当前的username(如果有),client_id与scope通过MD5加密生成的
具体实现请参考DefaultAuthenticationKeyGenerator.java类
user_name登录时的用户名, 若客户端没有用户名(如grant_type="client_credentials"),则该值等于client_id
client_id
authentication存储将OAuth2Authentication.java对象序列化后的二进制数据
refresh_token该字段的值是将refresh_token的值通过MD5加密后存储的
在项目中,主要操作oauth_access_token表的对象是JdbcTokenStore.java,更多的细节请参考该类

oauth_refresh_token

在项目中,主要操作oauth_refresh_token表的对象是JdbcTokenStore.java (与操作oauth_access_token表的对象一样)

更多的细节请参考该类,如果客户端的grant_type不支持refresh_token,则不会使用该表

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

oauth_code

在项目中,主要操作oauth_code表的对象是JdbcAuthorizationCodeServices.java

更多的细节请参考该类,只有当grant_type为"authorization_code"时,该表中才会有数据产生; 其他的grant_type没有使用该表

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

评论区