使用 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-simpledocumentation:

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 web api身份验证令牌cors问题

MVC .NET cookie 身份验证系统通过令牌身份验证访问 Web Api

使用 spotify-web-api-node 生成身份验证令牌

Azure AD 身份验证令牌未通过 Web api 授权