集成Google登录的网站,用Refresh Token换Access Token时如何验证身份?
当你用存储的refresh_token请求新access_token时,核心是要确认发起请求的人就是该refresh_token对应的用户,这里有几个实用的验证方式:
绑定用户会话与refresh_token
用户登录后,后端要维护一个有效的会话(比如用服务器端Session,或者给前端发JWT)。前端每次请求刷新token时,必须带上这个会话标识。后端先验证会话是否有效,再确认会话对应的用户ID和数据库中存储该refresh_token的用户ID一致,之后再调用Google的刷新接口。这样只有当前登录的用户才能触发自己的refresh_token刷新,避免他人盗用。用过期的access_token验证身份
虽然access_token过期了,但它包含的用户唯一标识(Google的sub字段)依然有效。前端请求刷新时,把过期的access_token一起传给后端。后端用Google的公钥验证这个token的签名(忽略过期时间),解析出sub字段,再和数据库中绑定该refresh_token的用户sub对比,匹配上再执行刷新。这样能确保请求者确实持有过该用户的有效access_token,是合法所有者。启用refresh_token轮换机制
Google支持refresh_token轮换:每次用旧的refresh_token请求新access_token时,Google会返回一个新的refresh_token,旧的随即失效。后端每次刷新后,要把数据库里的旧refresh_token替换成新的,同时确保只有当前登录的用户能触发这个操作。就算refresh_token意外泄露,也只能被使用一次,后续无效,大大降低风险。
另外要注意:后端的刷新接口必须做权限拦截,拒绝匿名请求;解析access_token时一定要验证签名,防止伪造的token绕过验证。
内容的提问来源于stack exchange,提问作者stamaimer

