【问题标题】:How does Spring Security OAuth2 know when a token expires?Spring Security OAuth2 如何知道令牌何时过期?
【发布时间】:2025-11-23 17:20:06
【问题描述】:

我添加了一个 JDBC 令牌存储并添加了来自 https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/test/resources/schema.sql 的 SQL(第一个和最后一个表除外)。然后我取了一个令牌:

$ curl -u xxx:123456 http://localhost:8080/oauth/token -d grant_type=client_credentials -d client_id=xxx -d client_secret=123456 -d scope=write

{"access_token":"0cbd0733-2c37-400b-abd7-5d1507c2204f","token_type":"bearer","expires_in":42498,"scope":"write"}

唯一有时间戳的表是oauth_approvals,但它是空的!

MariaDB [xxxxxx]> select * from oauth_approvals;
Empty set (0.00 sec)

那么 Spring 如何知道令牌何时过期?

我重新启动服务器并验证令牌仍然有效并且是相同的令牌。

【问题讨论】:

    标签: spring spring-security spring-security-oauth2


    【解决方案1】:

    如果您将 Oauth 与 JWT(json Web 令牌)一起使用,请查看这篇文章:https://jwt.io/introduction/

    JSON Web Tokens 由以点 (.) 分隔的三部分组成,它们是: 标题 有效载荷 签名 因此,JWT 通常如下所示。 xxxxx.yyyyy.zzzzz

    有效负载包含表示有关实体和令牌本身的信息的声明。这些声明包括:iss(发行人)、exp(到期时间)、sub(主题)、aud(受众)。

    所以基本上过期时间在token里面,可以用token本身来验证。

    有效负载可能不包含 exp 声明 => 令牌不会过期。

    【讨论】:

    【解决方案2】:

    一个迟到的答案,但它就在这里。

    您实际上使用的是client_credentials 授权类型,这意味着您没有代表Resource owner 授权您的客户端应用程序,而是访问您自己的帐户(没有任何用户名/密码)。因此oauth_approvals 将不会被填充。实际上,当Resource owner“授权”客户代表他访问他的帐户时,此表仅用于authorization_code 授权类型。

    根据您的问题,应该填充的表格是:

    • oauth_access_token: 哪个 principal 和 clientId 正在使用什么 访问令牌。在此表中,token 列存储了所有 包括您要求的到期时间在内的信息。
    • oauth_refresh_token: 请求新访问的刷新令牌 过期后的令牌。

    此表oauth_client_details 保存客户信息。您说您没有使用它,所以我假设您将客户详细信息存储在内存中。

    在此处阅读有关 oAuth2 协议的更多信息:https://oauth.net/2/

    【讨论】:

      最近更新 更多