2015-10-05 143 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時發送令牌(除了登錄和註冊)之外。還有其他解決方案可以建立會話,但我認爲它們實施起來有點困難。