1. 表结构说明:

表名称 字段名称 字段说明
oauth_client_details client_id 主键,必须且唯一
用来唯一标识客户端(client);在注册时必须填写;
针对不同grant_type,该字段是必须的。实际应用中的另一个名称叫appKey,与client_id同概念
resource_ids 客户端所能访问的资源id集合,多资源时用逗号(,)分割;
该字段必须来源于security标签<oauth2:resource-server 属性中的resource-id值一致。
client_seret 用于指定客户端(client)的访问秘钥,在注册时必须填写;
对不同grant_tpe字段都是必须的,实际应用中的另一个名称叫appSecret,与client_secret同概念
scope 指定客户端申请的权限范围,可选值包括:read、write、trust,若有多个权限用逗号(,)分割
scope值与security.xml配置的访问URL时候,客户端必须有read权限,且该值一般有服务器指定。
authorized_grant_type 指定客户端支持的grant_type,可选值包括authorization_code、password、refresh_token、implicit、client_credentials,若支持多个grant_type用逗号(,)分割。
在实际应用中,当注册时该字段有服务器指定。 最常用grant_type组合
“authorization_code,refresh_token”(浏览器访问的客户端);”password, refresh_token”(移动设备的客户端)
web_server_redirect_uri 客户端的重定向URI,可为空。当granttype为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/spring-oauth-client/implicit#access_token=dc891f4a-ac88-4ba6-8224-a2497e013865&token_type=bearer&expires_in=43199 然后,客户端通过JS等从hash值中取到access_token值.
authorities 指定客户端拥有的额SpringSecurity的权限值,可选。若存在多个,用逗号(,)分割。
对于是否设置该字段,根据grant_type判断,若客户端在OAuth流程中需要用户的用户名(username)与密码(password)的”authorization_code,password”,该字段可以不需要设置值;
如果是”implicit、client_credentials”,该字段必须要设置对应权限值,服务器是通过该字段权限判断
access_token_validity 设定客户端的access_token的有效时间(单位:秒),可选。默认有效时间(12小时);
服务端获取access_token JSON中的expires_in字段的值即为当前access_token的有效时间值。
实际应用中,服务器端处理,具体可参考DefaultTokenServices.java的属性accessTokenValiditySeconds
refresh_token_validity 设定客户端的refresh_token的有效时间(单位:秒),可选。默认有效时间(30天)。
客户端的grant_type不包括refresh_token,则不关心该字段。
实际应用中,服务器处理,具体可参考DefaultTokenServices.java的属性refreshTokenValiditySeconds
additional_information 预留字段,oauth流程中没有实际使用。可选,但若设置JSON:{“country”:”CN”,”country_code”:”086”}
create_time 数据的创建时间,精确到秒,有数据插入数据时,插入当前时间
archived 用于标识客户端是否已存档(即实际逻辑删除),默认值’0’(未存档)
trusted 设置客户端是否为授信任的,默认为”0”(即不受信任的,1为受信任)
只适合grant_type=”authorization_code”的情况,当用户登录成功后,该值若为0,则会跳转到Approve页面同意授权;若为1,在登录后不需要再让用户Approve同意授权。
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_access_token
client_id 客户端Id
token_id 该字段是将access_token的值通过MD5加密后存储
authentication_id 该字段具有唯一性,值根据当前userName(若有),client_id与scope,通过MD5加密生成,具体DefaultAuthenticationKeyGenerator.java类
token 存储将OAuth2Authentication.java对象序列化后的二进制数据
user_name 登录时的用户名,若客户端没有用户名(grant_type=”client_credenticals”),该值等同于client_id
authentication 存储将OAuth2Authentication.java对象序列化后的二进制数据
refresh_token 该字段的额值将refresh_token的值通过MD5加密后存储
create_time 数据闯将的时间,精确到秒
该表用于在客户端系统中存储从服务端获取的token数据, 在spring-oauth-server项目中未使用到.
对oauth_client_token表的主要操作在JdbcClientTokenServices.java类中, 更多的细节请参考该类.
oauth_client_token client_id 客户端id
authentication_id 该字段具有唯一性,根据 userName(若有), client_id 与scope 通过MD5加密生成
token_id 从服务器端获取到的access_token的值
token 这是一个二进制的字段, 存储的数据是OAuth2AccessToken.java对象序列化后的二进制数据
user_name 登录时的用户名
create_time 数据闯将的时间,精确到秒
该表用于在客户端系统中存储从服务端获取的token数据, 在spring-oauth-server项目中未使用到.
对oauth_client_token表的主要操作在JdbcClientTokenServices.java类中, 更多的细节请参考该类
oauth_refresh_token token_id 该字段的值是将refresh_token的值通过MD5加密后存储的
token 存储将OAuth2RefreshToken.java对象序列化后的二进制数据
authentication 存储将OAuth2Authentication.java对象序列化后的二进制数据
create_time 数据闯将的时间,精确到秒
在项目中,主要操作oauth_refresh_token表的对象是JdbcTokenStore.java. (与操作oauth_access_token表的对象一样);更多的细节请参考该类.
如果客户端的grant_type不支持refresh_token,则不会使用该表.
oauth_code code 存储服务端系统生成的code的值(未加密)
authentication 存储将AuthorizationRequestHolder.java对象序列化后的二进制数据
create_time 数据闯将的时间,精确到秒
在项目中,主要操作oauth_code表的对象是JdbcAuthorizationCodeServices.java. 更多的细节请参考该类.
只有当grant_type为”authorization_code”时,该表中才会有数据产生; 其他的grant_type没有使用该表