【问题标题】:API authentication using json web tokens jwt-simple使用 json Web 令牌的 API 身份验证 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 密钥之外,还有更好的方法吗?

提前致谢。

【问题讨论】:

  • 您不应该将密钥发送给任何人。您只是发送生成的令牌(您无法从中猜出密钥),然后您会取回该令牌。然后,您使用您的密钥来验证此令牌是您使用此密钥生成的并且未被篡改。此外,您需要每个发行者而不是每个用户一个密钥。

标签: node.js api express restful-authentication jwt


【解决方案1】:

关于您对秘密的困惑,请参阅此帖子:Can anybody decode a JSON Web Token (JWT) without a secret key?

至于你的问题:

  1. 是的,每个设法获得有效令牌的人都可以访问您的 API。因此,如果有人知道您用于签署令牌的密钥并且可以创建有效负载,他就可以使用 API。但通常的流程是:用户登录,你检查密码,如果密码正确,你给他一个有效的令牌。如果有人从该用户的计算机上获取该令牌,那么您无能为力。但是你可以让令牌过期,所以如果有人偷了它,它就会失效很长时间。

  2. 您可以使用相同的应用程序范围的机密对您的令牌进行签名,但您会使用一些独特的用户特定负载,以便每个用户都获得不同的令牌。

  3. 在一个简单的解决方案中,您只需在每次调用 API 时发送令牌(除了登录和注册)。还有其他建立会话的解决方案,但我认为它们实施起来有点困难。

【讨论】:

    猜你喜欢
    • 2018-05-07
    • 2018-07-01
    • 2016-12-10
    • 2019-08-19
    • 2021-10-12
    • 2018-01-20
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多