使用devise_token_auth调用create_new_auth_token后access-token与存储值不符
问题解答
为什么返回的access-token和数据库存储值不匹配?
这其实是devise_token_auth的安全设计,完全属于正常现象,不用慌!
当你调用user.create_new_auth_token时,方法会生成一个明文的access-token(就是你看到的Uof0cB0KcI5RH-GFOCezDw)返回给客户端,同时它会对这个明文token做bcrypt哈希处理,把哈希后的结果(也就是数据库里的$2a$10$trmOQQOnQRfMXGk0s8XS5ufUl9OHDnPcK7f4M4qXfGggj4gCUIc12)存在用户的tokens字段里。
这么做的核心原因是安全:如果数据库意外泄露,攻击者拿到的只是无意义的哈希字符串,没法直接用它冒充用户发起请求——验证身份时,服务器会把客户端传来的明文token重新哈希,再和数据库里的哈希值对比,只有匹配才会通过认证。要是直接存明文token,数据库泄露就等于所有用户的会话权限都被劫持了,风险极高。
access-token的含义及作用是什么?
简单来说,access-token就是客户端用来证明“我是某个合法用户”的身份凭证,核心作用有这几个:
- 免密认证:用户登录成功后拿到access-token,之后每次请求接口时,只需要把它放在请求头里,服务器就能直接识别出对应的用户,不用反复提交用户名和密码,既提升了体验又降低了密码泄露风险。
- 多设备会话管理:在devise_token_auth里,access-token会和
client、uid参数配合使用——每个客户端(比如用户的手机APP、网页端)会对应独立的client标识和access-token,服务器可以通过这组参数区分用户在不同设备上的会话,支持多设备同时登录,也能单独注销某台设备的权限。 - 权限管控载体:服务器可以通过access-token关联用户的权限信息,判断该用户是否有权限访问某个接口或资源,实现细粒度的权限控制。
内容的提问来源于stack exchange,提问作者Enrique Moreno Tent
相关产品推荐
相关产品推荐

