spring 官网供了存储 OAuth2 相关信息的数据库表结构 以下是mysql表结构
create table oauth_client_details (
client_id VARCHAR(128) PRIMARY KEY,
resource_ids VARCHAR(128),
client_secret VARCHAR(128),
scope VARCHAR(128),
authorized_grant_types VARCHAR(128),
web_server_redirect_uri VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additional_information VARCHAR(4096),
autoapprove VARCHAR(128)
);
create table oauth_client_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128)
);
create table oauth_access_token (
token_id VARCHAR(128),
token BLOB,
authentication_id VARCHAR(128) PRIMARY KEY,
user_name VARCHAR(128),
client_id VARCHAR(128),
authentication BLOB,
refresh_token VARCHAR(128)
);
create table oauth_refresh_token (
token_id VARCHAR(128),
token BLOB,
authentication BLOB
);
create table oauth_code (
code VARCHAR(128),
authentication BLOB
);
create table oauth_approvals (
userId VARCHAR(128),
clientId VARCHAR(128),
scope VARCHAR(128),
status VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP
);
-- customized oauth_client_details table
create table ClientDetails (
appId VARCHAR(128) PRIMARY KEY,
resourceIds VARCHAR(128),
appSecret VARCHAR(128),
scope VARCHAR(128),
grantTypes VARCHAR(128),
redirectUrl VARCHAR(128),
authorities VARCHAR(128),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additionalInformation VARCHAR(4096),
autoApproveScopes VARCHAR(128)
);
其中 oauth_client_details 最为重要 是oauth2的核心表 其他在现实应用下都可能省略。
oauth_client_details 接入的客户端信息
字段名 | 解释 |
client_id | 主键,必须唯一,不能为空. 用于唯一标识每一个客户端(client); 在注册时必须填写(也可由服务端自动生成). 对于不同的 grant_type,该字段都是必须的. 在实际应用中的另一个名称叫appKey,与client_id是同一个概念. |
resource_ids | 客户端能访问的资源id集合,多个用逗号分隔 , 注册客户端时,根据实际需要可选择资源id,也可以根 据不同的额注册流程,赋予对应的额资源id |
client_secret | 必须填写 ,用于指定客户端(client)的访问密匙; 在注册时必须填写(也可由服务端自动生成). 在实际应 用中的另一个名称叫appSecret,与client_secret是同一个概念. |
scope | 指定client的权限范围,比如移动端还是web端权限 ,哪个微服务权限 |
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,可为空, 当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值.如: http://localhost:7777/sp ring-oauth-client/implicit#access_token=dc891f4a-ac88-4ba6-8224-a2497e013865&token_type= bearer&expires_in=43199 然后客户端通过JS等从hash值中取到access_token值. |
authorities | 指定客户端所拥有的Spring Security的权限值,可选, 若有多个权限值,用逗号(,)分隔, 如: "ROLE_UNITY,ROLE_USER". 对于是否要设置该字段的值,要根据不同的grant_type来判断, 若客户端 在Oauth流程中需要用户的用户名(username)与密码(password)的(authorization_code,password), 则该字段可以不需要设置值,因为服务端将根据用户在服务端所拥有的权限来判断是否有权限访问对应 的API. 但如果客户端在Oauth流程中不需要用户信息的(implicit,client_credentials), 则该字段必须要 设置对应的权限值, 因为服务端将根据该字段值的权限来判断是否有权限访问对应的API. |
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格式的数据,如: {"country":"CN","country_code":"086"} 按照spring-security-oauth项目中对该字段的描述 Additional information for this client, not need by the vanilla OAuth protocol but might be useful, for example,for storing descriptive information. (详见ClientDetails.java的 getAdditionalInformation()方法的注释)在实际应用中, 可以用该字段来存储关于客户端的一些其他信 息,如客户端的国家,地区,注册时的IP地址等等. |
autoapprove | 设置用户是否自动Approval操作, 默认值为 'false', 可选值包括 'true','false', 'read','write'. 该字段只适 用于grant_type="authorization_code"的情况,当用户登录成功后,若该值为'true'或支持的scope值,则 会跳过用户Approve的页面, 直接授权. 是 spring-security-oauth2 的 2.0 版本后添加的新属性. |
楼主使用的配置
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_client_token:该表用于在客户端系统中存储从服务端获取的token数据, 在spring-oauth-server项目中未使用到. 对oauth_client_token表的主要操作在JdbcClientTokenServices.java类中, 更多的细节请参考该类.
字段名 | 解释 |
create_time | 数据的创建时间,精确到秒,由数据库在插入数据时取当前系统时间自动生成(扩展字段) |
token_id | 从服务器端获取到的access_token的值. |
token | 这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据. |
authentication_ | 该字段具有唯一性, 是根据当前的username(如果有),client_id与scope通过MD5加密生 成的. 具体实现请参考DefaultClientKeyGenerator.java类. |
user_name | 登录时的用户名 |
client_id |
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没有使用该表.
字段名 | 解释 |
code | 存储服务端系统生成的code的值(未加密). |
authentication | 存储将AuthorizationRequestHolder.java对象序列化后的二进制数据. |