使用 json Web 令牌的 API 身份验证 jwt-simple
Posted
技术标签:
【中文标题】使用 json Web 令牌的 API 身份验证 jwt-simple【英文标题】:API authentication using json web tokens jwt-simple 【发布时间】:2016-01-02 14:12:30 【问题描述】:我正在使用 jwt-simple 创建一个 api 密钥。基本上它所做的是encode(secret+data)
并将其与请求一起发送。我知道服务器将decode(encode(secret+data))
并验证它是一个有效的请求。
示例代码在jwt-simple
documentation:
var jwt = require('jwt-simple');
var payload = foo: 'bar' ;
var secret = 'xxx';
// encode
var token = jwt.encode(payload, secret);
// decode
var decoded = jwt.decode(token, secret);
console.log(decoded); //=> foo: 'bar'
我的问题是:
如果有人知道encode(data+key)
生成的令牌,他们就不能访问 API 吗?这就是我应该使用 HTTPS over HTTP 的原因吗?
我想我还需要在服务器上存储每个用户的秘密,因为它需要解码。如果我不正确,我应该将它存放在哪里?
如何发送多个 API 请求?除了为每个请求发送 API 密钥之外,还有更好的方法吗?
提前致谢。
【问题讨论】:
您不应该将密钥发送给任何人。您只是发送生成的令牌(您无法从中猜出密钥),然后您会取回该令牌。然后,您使用您的密钥来验证此令牌是您使用此密钥生成的并且未被篡改。此外,您需要每个发行者而不是每个用户一个密钥。 【参考方案1】:关于您对秘密的困惑,请参阅此帖子:Can anybody decode a JSON Web Token (JWT) without a secret key?
至于你的问题:
是的,每个设法获得有效令牌的人都可以访问您的 API。因此,如果有人知道您用于签署令牌的密钥并且可以创建有效负载,他就可以使用 API。但通常的流程是:用户登录,你检查密码,如果密码正确,你给他一个有效的令牌。如果有人从该用户的计算机上获取该令牌,那么您无能为力。但是你可以让令牌过期,所以如果有人偷了它,它就会失效很长时间。
您可以使用相同的应用程序范围的机密对您的令牌进行签名,但您会使用一些独特的用户特定负载,以便每个用户都获得不同的令牌。
在一个简单的解决方案中,您只需在每次调用 API 时发送令牌(除了登录和注册)。还有其他建立会话的解决方案,但我认为它们实施起来有点困难。
【讨论】:
以上是关于使用 json Web 令牌的 API 身份验证 jwt-simple的主要内容,如果未能解决你的问题,请参考以下文章
用于用户身份验证的个人访问令牌和 json Web 令牌有啥区别?
在 Objective-C 中使用身份验证获取 JSON 令牌
MVC .NET cookie 身份验证系统通过令牌身份验证访问 Web Api