我正在尝试使用JWT和Spring Boot 2实现OAuth2服务器。互联网上有一些很好的例子,例如this或this。他们正在使用一些数据库表(oauth_client_details
,oauth_client_token
,oauth_code
,oauth_approvals
,ClientDetails
)和一堆字段。其中一些很容易理解,另一些则不容易理解。我无法找到关于需要哪些表格和字段及其含义的任何解释:
create table oauth_client_details ( /*Stores client details*/
client_id VARCHAR(255) PRIMARY KEY,
resource_ids VARCHAR(255), /*Q1: is this comma separated list of resources?*/
client_secret VARCHAR(255),
scope VARCHAR(255),
authorized_grant_types VARCHAR(255),
web_server_redirect_uri VARCHAR(255),
authorities VARCHAR(255), /*Q2: what it this for?*/
access_token_validity INTEGER, /*Q3: Is this the validity period in seconds?*/
refresh_token_validity INTEGER,
additional_information VARCHAR(4096), /*Q4: Can I omit this field if I don't need any additional information?*/
autoapprove VARCHAR(255) /*Q5: What does this mean?*/
);
create table if not exists oauth_client_token ( /*Q6: What is this table for?*/
token_id VARCHAR(255),
token LONGVARBINARY,
authentication_id VARCHAR(255) PRIMARY KEY,
user_name VARCHAR(255),
client_id VARCHAR(255)
);
create table if not exists oauth_access_token ( /*Q7: Do I need this table if I use JWT?*/
token_id VARCHAR(255),
token LONGVARBINARY,
authentication_id VARCHAR(255) PRIMARY KEY,
user_name VARCHAR(255),
client_id VARCHAR(255),
authentication LONGVARBINARY,
refresh_token VARCHAR(255)
);
create table if not exists oauth_refresh_token ( /*Q8: Do I need this table if I use JWT?*/
token_id VARCHAR(255),
token LONGVARBINARY,
authentication LONGVARBINARY
);
create table if not exists oauth_code (
code VARCHAR(255), authentication LONGVARBINARY
);
create table if not exists oauth_approvals ( /*Q9: What it this for?*/
userId VARCHAR(255),
clientId VARCHAR(255),
scope VARCHAR(255),
status VARCHAR(10),
expiresAt TIMESTAMP,
lastModifiedAt TIMESTAMP
);
create table if not exists ClientDetails ( /*Q10: Yet another client details???*/
appId VARCHAR(255) PRIMARY KEY,
resourceIds VARCHAR(255),
appSecret VARCHAR(255),
scope VARCHAR(255),
grantTypes VARCHAR(255),
redirectUrl VARCHAR(255),
authorities VARCHAR(255),
access_token_validity INTEGER,
refresh_token_validity INTEGER,
additionalInformation VARCHAR(4096),
autoApproveScopes VARCHAR(255)
);
答案 0 :(得分:2)
如果是JWT令牌,则无需oauth_access_token
& oauth_refresh_token
个表格。检查JwtTokenStore
的实施以获取更多信息。
哪些表格是必需的,完全取决于您使用的OAuth Grant type。像oauth_code
&如果您使用oauth_approvals
授权类型,则需要Authorization code
。
在scope
和authorities
之间有所不同,请检查OAuth Scope vs Authorities
答案 1 :(得分:2)
以下是一些未回答的问题的答案。
Q4:是的,您可以省略
Q7,Q8:如果使用jwt,则不需要oauth_access_token,oauth_refresh_token表
当从客户端请求令牌时,访问令牌和相关详细信息存储在oauth_access_token表中。有效期到期后,将删除有关此令牌的详细信息。 oauth_refresh_token表存储刷新令牌的详细信息。访问令牌过期后,您可以使用此刷新令牌来获得新的访问令牌
答案 2 :(得分:1)
首先,很遗憾,我无法回答您所有的问题,但我至少可以回答一些问题:
Q1:是的,这是一个逗号分隔的列表。 Q3:是的,对。
只有某些表具有某些授权授予类型,如Afridi在他的回答中已经提到的。我发现这个特殊的page对于理解哪种授权类型如何工作以及我可能需要哪些表很有帮助。
Q10:我认为您不需要那个桌子。
答案 3 :(得分:0)
oauth_client_details
支持 JdbcClientDetailsService
。您可以使用自定义表创建 ClientDetailsService
实现。JdbcClientTokenServices
JwtTokenStore
JwtTokenStore
oauth_client_details