检查散列的 REST API 令牌

Posted

技术标签:

【中文标题】检查散列的 REST API 令牌【英文标题】:Checking hashed REST API token 【发布时间】:2014-12-11 02:01:06 【问题描述】:

我通过检查 Authorization 标头中的令牌来授权所有 REST API 请求:

POST /rest/resource HTTP/1.1
Host: domain.com
Authorization: Bearer AbCdEf123456

令牌是纯文本,使用 HTTPS。但是,令牌在数据库中被加盐和散列。

如何验证请求?

还将用户 ID 发送到服务器,从数据库中为该用户选择令牌哈希,检查令牌是否正确(发送用户 ID 的问题 - 放置位置) 检查数据库中的某些哈希是否对应于从用户收到的令牌(性能问题)

必须有一些优雅的方式,例如对于谷歌地图,“API 密钥”(令牌)就足够了。

【问题讨论】:

【参考方案1】:

使用 JWT (JSON Web Token) 作为授权承载。 JWT 可以在有效负载中包含用户 ID。您还可以轻松验证 JWT 是否由受信任方(可能是您)发布。 好消息是您无需从数据库中读取值即可验证 JWT。它是完全无状态的。

这是 JWT 工作原理的简单解释: http://www.intridea.com/blog/2013/11/7/json-web-token-the-useful-little-standard-you-haven-t-heard-about

您几乎可以找到任何语言的 JWT 库(只需 google 即可)

【讨论】:

看起来真不错。从事实来看,哈希真的很长。我仍然不明白 Google 如何仅使用“短”API 密钥来做到这一点。 API 密钥有所不同。它只是您客户的标识符。但它不用于身份验证或授权。您不能使用 API 密钥安全访问您的数据(例如读取您的联系人)。对于此类操作,您需要获取可能存储在某处的访问令牌(并且需要在服务器端查找)。

以上是关于检查散列的 REST API 令牌的主要内容,如果未能解决你的问题,请参考以下文章

REST api 认证机制

如何使 Vue.js 将散列密码发布到 Django REST API AbstractBaseUser 自定义模型?

有效地将给定令牌与数据库中的散列,盐渍令牌进行比较

为啥标准不提供通过内容检查散列 c 字符串的专业化

CSRF 令牌生成

开散列的实现--哈希冲突