背景
客服中心反馈广东平台同步数据到集团平台不成功,听到这个心里就隐隐约约猜到是啥,但为了验证自己的猜想就查看了相关的日志信息:
靠,真的是token不可用(不应该啊,昨天刚刚改成永久不失效的呀),没办法只能再查一下,争取18点下班(嘿嘿嘿).
业务背景
因为业务的关系,公司部署的是一个主平台,多个子平台,子平台的用户信息和账号信息都得同步到主平台,这样就可以在主平台登录然后选择或者直接跳转到对应的子平台,同步的逻辑是用http接口实现的.
因为之前业务和我前任的关系,oauth_client_details表中共用一个client_id,并设置了刷新时间,这就存在一个问题,A节点刷新token的话会导致B节点的token失效,而且每个子平台Redis设置缓存的时间可能存在不一致;这就导致了有子平台同步数据失败.
有考虑过给每个子平台设置不同的client_id,但是随着业务的不断增长和子平台的增加维护成本太大了,跟栈长讨论了一下,决定是把token设置为永久token,反正都是平台间调用,不对外暴露.
事故现场
相关配置
设置这个之前还是查了相关信息的
以为将access_token_validity和refresh_token_validity 设置为null就可以永久了(傻逼了,哈哈哈),不设置就是使用默认的值12个小时,难怪一天就失效了,这锅背的不怨啊.调用一下Spring-Security oauth2获取token的接口/auth/oauth/token?grant_type=client_credentials
expires_in 不返回才是永久的,说明没生效.
正确的配置
根据官方相关的说明找到相关代码org.springframework.security.oauth2.provider.token.DefaultTokenServices#createAccessToken
org.springframework.security.oauth2.common.DefaultOAuth2AccessToken#isExpired
可以大胆推测如果access_token_validity为负数就是永久不过期的,说干就干,修改相关配置
调用相关接口
nice,看了一下时间,可以准时下班,哈哈哈!
总结
修改框架内置好的参数一定要读透相关表达的含义,错了别怕,胆大心细,大胆推测,动手证明。