簡體   English   中英

無法使用 Express 和 Angular 將 JWT 存儲在 Cookie 中

[英]Can't store JWT in Cookie with Express & Angular

最近幾天我一直在拔頭發。 無論我進行多少次谷歌搜索,我都找不到答案,所以我來到這里作為最后的手段,希望能得到一些幫助。

我正在 MEAN 堆棧上創建一個完整的堆棧應用程序。 我的登錄有效。 它正在驗證 email 和密碼是否與我數據庫中用戶的 email 和密碼匹配。 現在我想向我的客戶發送一個 JWT 令牌,這樣我就可以保留用戶簽名的客棧。 我了解 JWT 的工作原理並且我已經生成了一個

 const ACCESS_TOKEN_SECRET = "a random string";
 const payload = {"username": login_result[0].username}; 
 const accessToken = jwt.sign(payload, ACCESS_TOKEN_SECRET);

這就是我的問題開始的地方。 我想將令牌存儲在 cookie 中,以防止 XSS 攻擊。 我嘗試了各種方法將 JWT 存儲在 cookie 中。 大多數論壇都寫了我應該做的

res.cookie('access_token', accessToken);

據我了解,這應該會自動將 JWT 存儲在我客戶端上名為“access_token”的 cookie 中。 但是,這不起作用。 當這一行在代碼中時,什么也沒有發生。 “什么都沒有發生”是指客戶端代碼沒有執行。

如果密碼/電子郵件無效,我會返回一個錯誤代碼。

if(res.msg == "403"){
        this.showLogErrorMsg = true;
      }

這部分有效。

else 語句看起來像這樣 else{ console.log("Valid username and password");

    window.location.href = "http://localhost:4200/profile";

  }

意思是,如果登錄錯誤,它會打印錯誤(確實如此),如果登錄正確,他們應該被重定向。 這是行不通的。 當我這樣做時它確實起作用了

ret.json({"access_token":accessToken}); 

但不適用於

   res.cookie('access_token', accessToken); 

這是我不明白的。 它不會將 access_token 存儲在 cookies 中,也不會執行 else 語句中的代碼。 我的服務器或客戶端上沒有錯誤消息。 此外,每個指南或教程都說要使用 res.cookie,因為我使用 Express 作為我的網絡服務器。 我什至嘗試添加以下選項:

    res.cookie('access_token', accessToken,{domain: domain, path: '/',httpOnly:false, 
               secure:false,sameSite:false});

解決方案是,以某種方式使 res.cookies 工作,我真的很想這樣做,因為它是“其他人都在使用的”,而且看起來真的很酷。 或者,將 JWT 令牌作為 res.json 發送,然后將令牌保存到 angular 中的 cookie。但是,這是否為 XSS 敞開了大門? 如果沒有,我如何將一些東西保存到 angular 中的 cookie 中?

提前謝謝你們。

這是一個設置、取消設置和顯示 cookies 的基本express應用程序。

  • 設置GET /login
  • 取消設置GET /logout
  • 顯示GET /

這不依賴於客戶端(角度)

# main.js
const express = require('express')
const cookieParser = require('cookie-parser')

const app = express()
app.use(cookieParser())

const port = 3000
const accessToken = 'XXXXXXXXXXXXXXXXXXXXX';

app.get('/', (req, res) => {
    res.json(req.cookies)
});

app.get('/login', (req, res) => {
    res.cookie('access_token', accessToken, { path: '/', httpOnly: true, sameSite: "strict" })
    res.send('"access_token" cookies was set !')
});

app.get('/logout', (req, res) => {
    res.cookie('access_token', accessToken, { maxAge: 0 })
    res.send('"access_token" cookies was unset !')
});

app.listen(port, () => {
    console.log(`Example app listening at http://localhost:${port}`)
});

暫無
暫無

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

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