Spring-Security oauth2 设置永久token踩的坑

 2023-01-16
原文作者:董_董 原文地址:https://juejin.cn/post/6998790732370673694
  • 背景

周三下午17点左右,客服中心反馈广东平台同步数据到集团平台不成功,听到这个心里就隐隐约约猜到是啥,但为了验证自己的猜想就查看了相关的日志信息,

202301012131563701.png靠,真的是token不可用(不应该啊,昨天刚刚改成永久不失效的呀),没办法只能再查一下,争取18点下班(嘿嘿嘿).

  • 业务背景

  • 因为业务的关系,公司部署的是一个主平台,多个子平台,子平台的用户信息和账号信息都得同步到主平台,这样就可以在主平台登录然后选择或者直接跳转到对应的子平台,同步的逻辑是用http接口实现的.
  • 因为之前业务和我前任的关系,oauth_client_details表中共用一个client_id,并设置了刷新时间,这就存在一个问题,A节点刷新token的话会导致B节点的token失效,而且每个子平台Redis设置缓存的时间可能存在不一致;这就导致了有子平台同步数据失败.
  • 有考虑过给每个子平台设置不同的client_id,但是随着业务的不断增长和子平台的增加维护成本太大了,跟栈长讨论了一下,决定是把token设置为永久token,反正都是平台间调用,不对外暴露.
  • 事故现场

相关配置

202301012131570812.png 设置这个之前还是查了相关信息的

202301012131575333.png 以为将access_token_validity和refresh_token_validity 设置为null就可以永久了(傻逼了,哈哈哈),不设置就是使用默认的值12个小时,难怪一天就失效了,这锅背的不怨啊. 调用一下Spring-Security oauth2获取token的接口 /auth/oauth/token?grant_type=client_credentials

202301012131581494.png expires_in 不返回才是永久的,说明没生效.

  • 正确的配置

根据官方相关的说明找到相关代码 org.springframework.security.oauth2.provider.token.DefaultTokenServices#createAccessToken

202301012131586835.png org.springframework.security.oauth2.common.DefaultOAuth2AccessToken#isExpired

202301012131593076.png 可以大胆推测如果access_token_validity为负数就是永久不过期的,说干就干,修改相关配置

202301012131599917.png 调用相关接口

202301012132006218.png nice,看了一下时间17:50,可以准时下班,哈哈哈!

  • 总结

修改框架内置好的参数一定要读透相关表达的含义,错了别怕,胆大心细,大胆推测,动手证明.