首页 > 解决方案 > 为什么我的 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;

我从前两天开始尝试,但到目前为止我无法得到任何解决方案,请帮忙。

标签: node.jsreactjsapifetch-apiweb-development-server

解决方案


由于secureauth.js 中的标志,它不起作用:

res.cookie("jwtoken",token,{
          expiresIn:"1h",
         httpOnly:true,
         secure:true
       }
       );

这是一个很好的安全实践,但它不适用于 localhost,因为它不是通过 HTTPS。您需要:

  • 禁用仅用于开发secure的标志,或
  • 启用 https 并使用自签名证书进行 localhost 开发,或者
  • 使用 TLS 终止代理,例如 haproxy

推荐阅读