聊聊 OAuth 2.0 的 token expire_in 使用
2020-06-08 16:02:21来源:博客园 阅读 ()
聊聊 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 。
项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注
原文链接:https://www.cnblogs.com/leng-leng/p/13064890.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 因为命名被diss无数次。简单聊聊编程最头疼的事情之一:命名 2020-06-10
- 聊聊微服务架构及分布式事务解决方案! 2020-06-10
- 聊聊 OAuth 2.0 的 Token 续期处理 2020-06-08
- Spring Security OAuth 格式化 token 输出 2020-06-08
- 从聚合支付业务的设计来聊聊策略模式 2020-06-03
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash