聊聊 OAuth 2.0 的 token expire_in 使用

简介:

问题背景

有同学私信问了这样的问题,访问 pig4cloud 的演示环境 查看登录请求 network 返回报文如下:

{
    "access_token":"16d35799-9cbb-4c23-966d-ab606029a623",
    "token_type":"bearer",
    "refresh_token":"495dbde5-1bbb-43c9-b06b-ecac50aa5d53",
    "expires_in":41000,
    "scope":"server"
}

而本地部署运行的时,登录请求返回的报文如下:

{
    "access_token":"c262afbe-441e-4023-afb4-f88c8a0a7d51",
    "token_type":"bearer",
    "refresh_token":"ea642d50-5cf5-48ad-9ef9-cb57c9dde00a",
    "scope":"server"
}

缺少 expires_in 过期参数,所以客户端无法知悉何时执行刷新行为。

源码剖析

我们来看下 oauth2 的令牌方法机制,如果客户端 配置的 validitySeconds (令牌有效期) 大于 0 会返回当前令牌的有效时间 expires_in 参数,

OAuth2AccessToken createAccessToken() {
  DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
  int validitySeconds = getAccessTokenValiditySeconds(authentication.getOAuth2Request());
  if (validitySeconds > 0) {
    token.setExpiration(new Date(System.currentTimeMillis() + (validitySeconds * 1000L)));
  }
  token.setRefreshToken(refreshToken);
  token.setScope(authentication.getOAuth2Request().getScope());

  return accessTokenEnhancer != null ? accessTokenEnhancer.enhance(token, authentication) : token;
}
  • tokenStore 去存储 令牌的时候,若过期参数为 0 或者 小于 0 Expiration 为空,不会设置有效时间也就意味着为永久有效,所以此时不会客户端响应 expires_in 参数
if (token.getExpiration() != null) {
  int seconds = token.getExpiresIn();
  conn.expire(accessKey, seconds);
  conn.expire(authKey, seconds);
  conn.expire(authToAccessKey, seconds);
  conn.expire(clientId, seconds);
  conn.expire(approvalKey, seconds);
}

永久有效的令牌是否应该返回 expires_in 参数呢?

我们先来看下oauth2 协议规范

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create"
}
  • access_token (必需) 授权服务器发出的访问令牌
  • token_type (必需)这是令牌的类型,通常只是字符串“bearer”。
  • expires_in (推荐)如果访问令牌过期过期时间。
  • refresh_token(可选)刷新令牌,在访问令牌过期后,可使用此令牌刷新。
  • scope(可选)如果用户授予的范围与应用程序请求的范围相同,则此参数为可选。

此处 expires_in 推荐返回,无论是有设置有效期限制还是无有效期限制。所以此处 spring security oauth2 的处理并不符合协议规范 emmm 。

目录
相关文章
|
前端开发 Java 数据安全/隐私保护
聊聊 OAuth 2.0 的 Token 续期处理
Token 校验逻辑 // CheckTokenEndpoint.checkToken @RequestMapping(value = "/oauth/check_token") @ResponseBody public Map checkToken(@RequestPara.
1775 0
|
8月前
|
Linux 数据安全/隐私保护
Token如何生成?
Token如何生成?
262 0
|
9月前
|
存储 安全 前端开发
token详解
token详解
2044 0
|
11月前
|
缓存 前端开发 算法
深入理解token
Token 是在服务端产生的。如果前端使用用户名/密码向服务端请求认证,服务端认证成功,那么在服务端会返回 Token 给前端。前端可以在每次请求的时候带上 Token 证明自己的合法地位
488 0
|
算法 中间件
koa如何进行token设置和进行token过期验证
两个参数分别是签名算法和自定义的签名Key(盐)。签名key可以byte[] 、String及Key的形式传入。前两种形式均存入builder的keyBytes属性,后一种形式存入builder的key属性。如果是第二种(及String类型)的key,则将其进行base64解码获得byte[] 。
|
NoSQL 安全 Java
JWT如何解析过期的token中的信息
JWT如何解析过期的token中的信息
1016 0
JWT如何解析过期的token中的信息
|
前端开发 算法 网络安全
深入理解Token
深入理解Token
900 0
深入理解Token
|
存储 算法 Shell
登录凭证(cookie+session和Token令牌)
登录凭证(cookie+session和Token令牌)
281 0
登录凭证(cookie+session和Token令牌)
|
JSON 安全 Java
Jwt和Token
Jwt和Token的认识
1409 0
Jwt和Token
|
开发工具
获取Token
获取Token
2659 0