angularjs 无法使用Express和Angular在Cookie中存储JWT

vq8itlhq  于 6个月前  发布在  Angular
关注(0)|答案(1)|浏览(45)

这两天我一直在烦恼,无论我用谷歌搜索多少次,都找不到答案,所以我来到这里,作为最后的手段,希望能得到一些帮助。
我正在MEAN堆栈上创建一个全堆栈应用程序。我的登录工作正常。它正在验证电子邮件和密码是否与数据库中用户的电子邮件和密码匹配。现在我想向我的客户端发送一个JWT令牌,这样我就可以保持用户的签名inn。我了解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存储在我的客户端上的cookie中,名称为“access_token”。然而这并不起作用。当这一行出现在代码中时,什么也没有发生。“什么也没有发生”我的意思是客户端代码没有执行。
如果密码/电子邮件无效,我将返回错误代码。

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存储在cookie中,也不执行else语句中的代码。在我的服务器或客户端上没有错误消息。此外,每个指南或教程都说要使用res.cookie,因为我使用Express作为我的Web服务器。
我甚至尝试添加以下选项:

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


解决方案是,以某种方式使res.cookies工作,我真的很想这样做,因为它是“其他人都在使用”,它似乎真的很酷。或者,发送JWT令牌作为res.json,然后保存令牌到angular中的cookie。然而,这是否会打开XSS?如果不是,我如何保存一些东西到angular中的cookie?
提前谢谢你们。

pxyaymoc

pxyaymoc1#

这是一个基本的express应用程序,用于设置,取消设置和显示cookie。

  • 设置GET /login
  • 未设置GET /logout
  • 显示器GET /

这与客户端无关(Angular )

# 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}`)
});

字符串

相关问题