簡體   English   中英

使用JWT保護Rest API

[英]Securing rest api with jwt

我一直在嘗試通過身份驗證來保護我的其余api,因此只有受信任的應用才能使用此api。 我一直在尋找最佳實踐和指南,但沒有一個在實際示例中進行實際解釋。

我創建了類似於以下內容的jsonwebtoken身份驗證:

if(!user){
    res.json({success:false, message: 'auth failed, user not found'});
} else {
    var token = jwt.sign(user, app.get('superSecret'), {
        expiresIn: 1440 //24 hours
    });
    res.json({
        success: true,
        message: 'token generated',
        token: token
    });
}

這樣工作正常,返回一個令牌,然后我可以將其與所有請求一起傳遞給api,但是如何使應用找到該令牌並使用它,而不是在每個api調用中手動傳遞令牌?

我已經看到,在大多數時候,您可以在應用程序內生成特殊的api-key,並將該信息包含在客戶端應用程序中,其工作方式類似於令牌,而無需從服務器請求新令牌。

它是如何工作的,或者如何為我的寧靜服務創建受信任的應用程序密鑰?

使用JWT非常好,實際上我是自己使用它的。 但是在示例中使用它的方式並不十分安全。 JWT不加密,而只是編碼。 如果您將此令牌發送給某人並包含敏感信息(例如superSecret ,則superSecret訪問該令牌的任何人都可以對其進行解碼。

一個更干凈的想法是將此令牌附加到會話對象。 如果您使用的是Node.js和Express,則可以使用express-session庫。 這會將會話對象附加到每個請求。 用戶通過身份驗證后,可以將此令牌分配給會話對象,並將其存儲在數據庫或內存存儲(例如redis 為了增加安全性,您可以為每個受信任的應用程序生成一個api-key ,並將其存儲在數據庫中。 可以將api-key作為標頭傳遞。

要使用Express設置會話,但我建議您閱讀其他選項和配置方法以符合需要:

var session = require("express-session");
app.use(session({
        secret: /* Your secret. */,
        store: /* Your redis store object. */,
        client: /* Your redis client object. */,
        resave: false,
        saveUninitialized: false
}));

要將登錄access-token附加到用戶的登錄名(例如):

router.post("/login", function(request, response){

    /* Do all user validation here */

    request.session.token = jwt.sign({
            /* User info to store in session. */
    }, "superSecret");

    return response.redirect( /* Dashboard */ );

});

那么,您對用戶進行身份驗證的方式將是:

  1. 驗證api-key是否有效。
  2. 檢查if(!user.session){ // Route to login page. } if(!user.session){ // Route to login page. }
  3. 檢查if(!user.session.token){ // Not authorized. } if(!user.session.token){ // Not authorized. }
  4. 驗證user.session.token
  5. 使用令牌中的憑據(不要在此處輸入用戶密碼),請確認該用戶是您系統中的有效用戶-假設他們已在您的網站/平台上注冊了一個帳戶。 例如,您可以使用電子郵件地址或用於驗證的內容存儲權限級別和用戶ID。

我希望這有幫助! 包裝您的頭部身份驗證實踐需要一段時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM