當用戶註冊時,您需要像現在一樣生成JWT。沒關係。但是,您不需要將其保存到數據庫。您沒有問,但我認爲密碼不應以明文形式存儲。在將其保存到數據庫之前,您可以使用bcrypt進行加密。
當用戶嘗試用正確的憑據登錄,然後我會送存儲令牌
是的,這是正確的方式做了迴應。
然後在客戶端(在我的控制器中)我使用localstorage來存儲令牌,以便我可以爲客戶端發送的每個請求發送相同的令牌。
是,在客戶端,您可以將JWT保存到本地存儲,並在隨後請求到服務器發送。
現在你要點:
所以,你不會有相同的JWT各一次,您可以在有效載荷的「EXP」要求(我假設你正在使用的東西像jwt-simple來生成JWT)。喜歡的東西:
var payload = { sub: account.username, exp: moment().add(10, 'days').unix() }; var token = jwt.encode(payload, "secret");
你並不需要在JWTs存儲在數據庫中。在某些情況下,令牌發行者(授權服務器)與資源服務器不同。資源服務器僅在請求中接收JWT,但資源服務器無法觸及授權服務器使用的數據庫。附註:如果您最終需要支持刷新令牌,即交給客戶端的JWT最終需要過期,則可以將刷新令牌存儲在數據庫中。刷新令牌與JWT(訪問令牌)不同。支持刷新令牌的複雜性會增加。
本地存儲是不是你存儲密碼,但它可以被用來存儲JWTs。出於這個原因,JWT必須並且應該在一段時間後過期。
不知道你說你檢查這兩個客戶端和服務器端的意思。當客戶端需要訪問資源時(再次假設資源服務器可能與授權服務器不一樣),資源服務器傳遞的唯一信息就是JWT。任何人都可以解碼智威湯遜。例如,嘗試將您的JWT粘貼到此網站http://jwt.io/。這就是爲什麼JWT不應包含任何敏感數據。但是如果資源服務器知道授權服務器在對JWT進行編碼時使用的祕密,那麼資源服務器可以驗證簽名。回到第三個項目符號,這就是將JWT存儲在客戶端本地存儲中的原因。
更新我更新這回答大家的一些問題在留言框中。
用戶點擊「登錄」按鈕觸發角控制器張貼到服務器的請求時,是這樣的:
$http.post(url, {
username: $scope.username,
password: $scope.password
}).success(function(res) { ... })
服務器接收POST請求時,它檢查用戶名/密碼,那麼它會產生一個JWT ,併發回給瀏覽器。請注意,它不必將JWT保存到數據庫。該代碼會是這樣的
var payload = {
sub: account.username,
exp: moment().add(10, 'days').unix()
};
var token = jwt.encode(payload, "secret");
res.status(200).json({
token: token
});
回到在客戶端,在上面的成功()回調,現在你可以保存JWT在本地存儲:現在
.success(function(res) { $window.localStorage.setItem('accessJWT', res.token) })
的用戶進行身份驗證。現在,當用戶想要訪問受保護的資源時,用戶不必提供用戶名/密碼。通過可從本地存儲中檢索的JWT,客戶端現在可以使用承載方案將JWT放入請求的Authorization標頭中,並將請求發送到服務器。在代碼中,它會:
headers.Authorization = 'Bearer ' + token;
服務器接收到請求。同樣,接收此請求的服務器不必與生成上述JWT的服務器相同。這兩臺服務器可以位於兩個不同的大陸。即使上面保存了JWT,對於無法訪問存儲JWT的數據庫的服務器也無濟於事。但是這個服務器可以從請求頭中取出不記名令牌,驗證令牌並繼續正常的任務。
希望這會有所幫助。
沒有在數據庫中存儲令牌,我如何在每次用戶登錄時在服務器端操作我的令牌。 我想我可以將令牌存儲在$ rootscope中,而不是本地存儲中?如果我沒有錯! 或我應該去參加會議嗎? 而且我怎麼能每次不同地爲特定用戶生成令牌? –
不,會話是JWT從未需要的,它旨在在移動設備中工作。正如我所說的,要獲得不同的標記,請添加基於時間的到期聲明。每次生成令牌時,時間都會有所不同,因此聲明將有所不同,因此有效負載將有所不同,因此令牌會有所不同。同樣,你不需要存儲令牌。用戶登錄時,檢查有效憑證。如果有效,請發出令牌。當用戶想要訪問某個資源時,會在請求頭中傳遞一個令牌,然後資源服務器可以驗證該令牌。 –
一切都很好,但我怎麼能得到在serverside(在server.js)每個請求生成的令牌,becoz我不存儲令牌,我在我的MongoDB中使用jwt生成的令牌? –