Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Can';t使用Express&;将JWT存储在Cookie中;有棱角的_Node.js_Angularjs_Cookies_Jwt_Mean Stack - Fatal编程技术网

Node.js Can';t使用Express&;将JWT存储在Cookie中;有棱角的

Node.js Can';t使用Express&;将JWT存储在Cookie中;有棱角的,node.js,angularjs,cookies,jwt,mean-stack,Node.js,Angularjs,Cookies,Jwt,Mean Stack,这几天我一直在拔头发。不管我做了多少次谷歌搜索,我都找不到答案,所以我来到这里,作为最后的手段,希望能得到一些帮助 我正在平均堆栈上创建一个完整的堆栈应用程序。我的登录有效。它正在验证电子邮件和密码是否与我数据库中用户的电子邮件和密码匹配。现在我想向我的客户发送一个JWT令牌,这样我就可以让用户签名。我了解JWT的工作原理,并且已经生成了一个 const ACCESS_TOKEN_SECRET = "a random string"; const payload = {&

这几天我一直在拔头发。不管我做了多少次谷歌搜索,我都找不到答案,所以我来到这里,作为最后的手段,希望能得到一些帮助

我正在平均堆栈上创建一个完整的堆栈应用程序。我的登录有效。它正在验证电子邮件和密码是否与我数据库中用户的电子邮件和密码匹配。现在我想向我的客户发送一个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存储在我的客户机上的cookie中,并命名为“access_token”。然而,这不起作用。当代码中有这一行时,什么也没有发生。我所说的“什么都没有发生”是指客户端代码没有执行

如果密码/电子邮件无效,我将返回错误代码

if(res.msg == "403"){
        this.showLogErrorMsg = true;
      }
这部分有效。

else语句如下所示 否则{ console.log(“有效用户名和密码”)

也就是说,如果登录错误,它将打印一个错误(它确实打印了),如果登录正确,它们应该被重定向。这不起作用。我这样做的时候它确实起作用了

ret.json({"access_token":accessToken}); 
但不适用于

   res.cookie('access_token', accessToken); 
这是我不理解的。它不在cookie中存储access_令牌,也不执行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中


提前感谢各位。

这是一款基本的
express
应用程序,用于设置、取消设置和显示cookies

  • 设置
    GET/login
  • 取消设置
    GET/logout
  • 显示
    GET/
这不依赖于客户端(角度)


您能否确认客户端已正确接收
Set Cookie
头?(开发工具>网络)我不相信有一个设置Cookie头。我不太熟悉网络部分,所以我将链接一些屏幕截图。这是当我尝试使用正确的用户名/密码登录时,在网络部分发生的情况:我可以问一下,设置Cookie头是什么吗?
Set Cookie
是告诉客户端保存信息的头或者域。当您使用express并调用
res.cookie('cookie_NAME',…)
时,它(应该)生成一个
Set cookie
头来携带数据并将数据设置到客户端。要测试这一点,请创建最简单的端点并设置cookie(删除中间件,因为没有设置头)。@Daniel我很不确定如何使用它“创建最简单的端点并设置cookie(删除中间件,因为未设置标头)”。您的意思是,使用express(后端)创建一个Web服务器,并将cookie发送到随机前端组件(客户端),而无需任何“更改”“针对我的DB进行验证?是的。如果您的问题是设置Cookie,请尝试将问题简化为最简单的形式谢谢@Daniel。问题似乎是,我需要使用GET请求来设置Cookie?如果我将您的代码更改为POST(如我的代码)它将添加SET-COOKIE标头,但不显示COOKIE。但是,如果我使用GET-request,它将在我的浏览器中设置COOKIE。无论如何,我可以通过POST请求执行此操作?经过进一步测试,它似乎也不会总是在GET-request上设置COOKIE。我必须进入网络并单击程序包,然后它才会显示cook我可以在我的标题中看到设置的Cookie,但在我的应用程序>Cookies中看不到它,在我点击包本身之前。我上传了一个显示完整流程的GIF
    res.cookie('access_token', accessToken,{domain: domain, path: '/',httpOnly:false, 
               secure:false,sameSite:false});
# 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}`)
});