node.js - 为什么我的 cookie 没有保存在浏览器中?
问题描述
当我从那时开始运行时router.post("/signin", async (req, res)
,auth.js
cookie 没有保存在我的本地主机中。
这是index.js
const express = require("express");
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const cors = require("cors");
const { google } = require("googleapis");
const cookieParser= require('cookie-parser');
const app = express();
app.use(cors());
app.use(express.json());
const passport = require("passport");
dotenv.config({ path: "./config.env" });
const db = require("./db/connection");
app.use(require('./router/auth'));
const User= require("./UserSchema/Schma")
const messages=require("./sendMessage/message");
// messages()
// .then((e)=>{console.log(e)})
app.use(cookieParser());
app.listen(3001, (req, res) => {
console.log(`server running at port no 3001`);
});
这是auth.js
const express = require("express");
const router = express.Router();
const bcrypt = require('bcryptjs');
const jwt= require('jsonwebtoken');
const User = require("../UserSchema/Schma");
const cookieParser = require("cookie-parser");
const authenticate = require('../middleware/authenticate');
let token;
router.post("/signin", async (req, res) => {
console.log(req.body);
// res.cookie("raushan", "raushan");
try {
const { email, password } = req.body;
if (!email || !password) {
return res.json({ error: "invalid credentials you added " });
}
const details = await User.findOne({ email: email });
console.log(details);
if (!details) {
return res.json({ error: "users error" });
}
else
{
const isMatch = await bcrypt.compare(password,details.password);
console.log(isMatch);
token= await details.generateAuthToken();
console.log(token);
res.cookie("jwtoken",token,{
expiresIn:"1h",
httpOnly:true,
secure:true
}
);
if (!isMatch) {
return res.status(400).json({ error: "invalid credientials" });
} else {
return res.json({ message: "user signin successfully" });
}
}
}
catch {
console.log("something going bad");
res.status(400).json({ error: "sorry something missing" })
}
});
module.exports = router;
和这个Schema.js
和在这个generateAuthToken()
函数里面
const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const jwt= require("jsonwebtoken");
const userSchema = new mongoose.Schema({
name: {
type: String,
require:true,
},
email: {
type: String,
require:true,
},
phone :{
type:Number,
require:true,
},
work:{
type:String,
require:true,
},
password:{
type:String,
require:true,
}
,
cpassword:{
type:String,
require:true,
},
tokens:[{
token:{
type:String,
require:true,
}
}]
});
userSchema.pre('save', async function(next) {
if(this.isModified('password'))
{
this.password=await bcrypt.hash(this.password,12);
this.cpassword=await bcrypt.hash(this.cpassword,12);
}
next();
})
userSchema.methods.generateAuthToken= async function(){
try {
let token= jwt.sign({_id:this._id},process.env.SECRET_KEY);
this.tokens=this.tokens.concat({token:token});
await this.save();
return token;
} catch (error) {
console.log(err);
}
}
const User = mongoose.model("USER", userSchema);
module.exports = User;
我从前两天开始尝试,但到目前为止我无法得到任何解决方案,请帮忙。
解决方案
由于secure
auth.js 中的标志,它不起作用:
res.cookie("jwtoken",token,{
expiresIn:"1h",
httpOnly:true,
secure:true
}
);
这是一个很好的安全实践,但它不适用于 localhost,因为它不是通过 HTTPS。您需要:
- 禁用仅用于开发
secure
的标志,或 - 启用 https 并使用自签名证书进行 localhost 开发,或者
- 使用 TLS 终止代理,例如 haproxy
推荐阅读
- validation - Haskell IO,在同一行中获取两个输入并进行验证
- laravel - 如何在 laravel 7 中安装 github 包
- javascript - 从另一个组件传递 useState
- scala - 从案例类生成 Json 模式(播放框架)
- javascript - AJAX URL 中的 AEM Servlet 资源类型
- javascript - 当书从一个书架移动到另一个书架时,它显示 this.props.onUpdateShelf 不是一个函数
- laravel - Laravel,该类存在,但我得到目标类 [PagesController] 不存在
- excel - Excel Web 查询与 MSXML2.XMLHTTP60
- php - 在现有的 Google Drive 文件夹中创建一个空白文件 - V3 - PHP
- ruby-on-rails - omniauth:(microsoft_graph_auth)身份验证失败!invalid_credentials: OAuth2::Error