2015-10-05 93 views
0

我正在使用jwt-simple来创建api密钥。基本上它的作用是encode(secret+data)并发送附加请求。我知道服务器将decode(encode(secret+data))并验证它是一个有效的请求。 示例代码jwt-simpledocumentation发现:使用json web令牌进行API认证jwt-simple

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' } 

我的问题是:

  • 会不会有人能够访问的API,如果他们知道通过encode(data+key)生成的令牌?这就是为什么我应该通过HTTP使用HTTPS?
  • 我想我需要将每个用户的秘密存储在服务器上,因为它需要解码。如果我不正确,我应该在哪里存储它?
  • 我将如何发送多个API请求?除了为每个请求发送API密钥之外,还有更好的方法吗?

在此先感谢。

+1

你不应该把密钥发送给任何人。您只发送生成的令牌(从中无法猜测密钥),并将该令牌返回。然后您使用密钥来验证此令牌是由您使用此密钥生成的,并未被篡改。您还需要每个发行者一个密钥,而不是每个用户。 – masimplo

回答

1

见关于你的困惑与秘密这篇文章:Can anybody decode a JSON Web Token (JWT) without a secret key?

至于你的问题:

  1. 是的,大家谁不知何故设法得到一个有效的令牌可以访问你的API。因此,如果有人知道您用于签署令牌的密钥并可以创建有效的有效负载,则可以使用该API。但通常的流程是:用户登录,检查密码,如果密码是正确的,你给他一个有效的令牌。如果有人从该用户计算机上获取该令牌,则可以做的事情不多。但是你可以让令牌失效,所以如果有人偷了一个,它就不会有效。

  2. 您可以使用相同的应用程序范围的秘密签署您的令牌,但您会使用一些唯一的用户特定有效内容,以便每个用户都获得不同的令牌。

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