Spring Boot OAuth2 提供者数据库表解释

Posted

技术标签:

【中文标题】Spring Boot OAuth2 提供者数据库表解释【英文标题】:Spring Boot OAuth2 provider database tables explained 【发布时间】:2018-11-20 13:50:30 【问题描述】:

我正在尝试使用 JWT 和 Spring Boot 2 实现 OAuth2 服务器。互联网上有一些很好的示例,例如 this 或 this。他们正在使用一些带有一堆字段的数据库表(oauth_client_detailsoauth_client_tokenoauth_codeoauth_approvalsClientDetails)。其中一些很容易理解,而另一些则不然。我在任何地方都找不到关于需要哪些表和字段以及它们的含义的解释:


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)
);

【问题讨论】:

我也在寻找一些解释。 Spring 是否有上述模式的官方文档?我搜索并找不到任何东西。有人可以帮忙吗? 很遗憾,我找不到 Spring 的任何官方文档,我不相信它存在。 【参考方案1】:

如果是 JWT 令牌,则不需要 oauth_access_tokenoauth_refresh_token 表。检查JwtTokenStore 的实现以获取更多信息。

哪些表是必需的,完全取决于您使用的OAuth Grant type。如果您使用的是Authorization code 授权类型,则需要oauth_codeoauth_approvals 之类的表。

scopeauthorities 之间的差异,请查看 OAuth Scope vs Authorities

【讨论】:

【参考方案2】:

这里是一些没有回答的问题的答案。

Q4 : 是的,你可以省略

Q7、Q8:如果使用 jwt,则不需要 oauth_access_token、oauth_refresh_token 表,

当客户端请求令牌时,访问令牌和相关详细信息存储在 oauth_access_token 表中。有效秒数到期后,有关此令牌的详细信息将被删除。 oauth_refresh_token 表存储刷新令牌的详细信息。在访问令牌过期后,您可以使用此刷新令牌来实现新的访问令牌

【讨论】:

【参考方案3】:

首先,很遗憾,我不能回答你所有的问题,但我至少可以回答一些:

Q1:是的,它是一个逗号分隔的列表。 Q3:是的,没错。

只有某些授权授予类型才需要几个表,正如 Afridi 在他的回答中已经提到的那样。我发现这个特殊的page 非常有助于理解哪种授权类型的工作原理以及我可能需要哪些表。

Q10:我认为你不需要那张桌子。

【讨论】:

【参考方案4】: Q1:是的 Q2:不适用 Q3:是的 Q4:是的。注意:oauth_client_details 支持JdbcClientDetailsService。您可以使用自定义表创建 ClientDetailsService 实现。 Q5:授权自动批准的客户端范围 服务器,支持授权码流 Q6:此表由JdbcClientTokenServices使用 Q7:是的,这个表支持JwtTokenStore Q8:是的,这个表支持JwtTokenStore Q9:店铺审批状态,支持授权码流 Q10:如果需要,只需自定义oauth_client_details

【讨论】:

以上是关于Spring Boot OAuth2 提供者数据库表解释的主要内容,如果未能解决你的问题,请参考以下文章

OIDC - 使用 IdentityServer3 和 Spring Boot 实现 OAuth2

将 Spring Boot oAuth2 应用程序作为资源服务器运行并提供 Web 内容

Spring Boot Oauth2缓存UserDetails到Ehcache

Spring Boot(OAuth2 和 REST):BeanCreationError

Spring Boot OAuth2:如何检索用户令牌信息详细信息

如何在 Spring Boot 中使用 IPwhitelisting 和 OAuth2? [复制]