首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速/护照创建会话,但不向前端发送cookie

快速/护照创建会话,但不向前端发送cookie
EN

Stack Overflow用户
提问于 2020-05-30 01:50:13
回答 1查看 956关注 0票数 3

现在,我有一个react和node.js项目正在运行。

http:..localhost:5000

  • 客户端(React)- http://localhost:3000
  • Server side(Node.js)

我目前正在尝试实现用户身份验证会话。到目前为止,它将向服务器发送用户名、密码和电子邮件(注册时)。然后,服务器将解析数据并尝试注册/登录用户。用户凭据存储在MongoDB图集数据库中。如果成功,它将将信息发送回服务器。

在成功的身份验证之后,服务器应该创建会话和cookie对。会话将被存储,cookie将被发送到客户端。然而,后半部分并没有发生。我知道会话是成功创建的,因为它存储在MongoDB中的另一个数据库中,但是无论我做什么,我似乎都无法将cookie带到前端。

UserModel

代码语言:javascript
复制
const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');
const passportLocalMongoose = require('passport-local-mongoose');
const bcrypt = require('bcrypt');
const SALT_WORK_FACTOR = 10;
const userSchema = new mongoose.Schema({
    username:{
        type: String,
        lowercase:true,
        unique: true,
        required:[true, 'Username is required'], 
        match:[/^[a-zA-Z0-9]+$/, 'is an invalid username'],
        index: true
    },
    password:{
        type: String,
        required:[true, 'Password is required']
    },
    email:{
        type:String,
        lowercase:true,
        unique:true,
        required:[true, 'Email is required'],
        match:[/\S+@\S+\.\S+/, 'is an invalid email'],
        index: true, 
        uniqueCaseInsensitive: true
    }
}, {timestap: true})

userSchema.plugin(uniqueValidator, {message: '{PATH} is already taken.'});


//encrypt the password
userSchema.pre('save', function(next) {
    var user = this;
// only hash the password if it has been modified (or is new)
if (!user.isModified('password')) return next();

// generate a salt
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
    if (err) return next(err);

    // hash the password using our new salt
    bcrypt.hash(user.password, salt, function(err, hash) {
        if (err) return next(err);

        // override the cleartext password with the hashed one
        console.log("hashedPassword stored");
        user.password = hash;
        next();
    });
});
});

//validatePassword
userSchema.methods.comparePassword = function(candidatePassword, cb) {
    bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
        if (err) return cb(err);
        cb(null, isMatch);
    });
};



userSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model('users', userSchema, 'userInfo');

authRouter.js

代码语言:javascript
复制
router.post("/register-login",
            //this section checks the authentication
        (req, res, next) =>{

            passport.authenticate('local'
            ,   
            {   successRedirect: '/',
                failureRedirect: '/listingsForm'
            }
            ,
            //this will be called if authenticate was successful
            (err, user, info) => {
                if(req.body.isSignUp){

                    if(err){
                        return res.status(400).json({errors:err});
                    }
                    if(!user){

                        return res.status(400).json({errors:info});
                    }
                    else{   

                        return res.status(200).json({success: `created ${user.username}`});
                    }
                }
                else{
                    if(err){
                        return res.status(400).json({errors:err});
                    }
                    if(!user){
                        return res.status(400).json({errors:info});
                    }
                    else{
                        console.log(user.id);
                        req.login(user, (err)=>{
                            if(err){
                                throw err;
                            }
                        });
                        return res.status(200).json({success:`Welcome back ${user.username}`});
                    }
                }
            })(req,res,next)
        }

authUser.js

代码语言:javascript
复制
const User = require('../schemes/User')
const passport = require('passport');
const LocalStrategy = require('passport-local');

passport.serializeUser((user,done) =>{
    console.log(user.id);
    done(null,user.id);
})

passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    });
});

passport.use(
    new LocalStrategy(

        {
            usernameField: 'username',
            passwordField: 'password',
            passReqToCallback: true
        },

        (req, username, password, done) =>{

        // console.log(username, password);
        console.log(req.body);
        //For Register  
        if(req.body.isSignUp){
            //determine it is a register attempt
            const newUser = new User({
            username: username,
            password: password,
            email: req.body.email
            });



            newUser.save()
            .then(
                user => {

                    return done(null,user);
                }
            )
            .catch(
                err => {
                    console.log('there is error');
                    console.log(err);
                    return done(null, false, {message:err.message});
                }
            )
        }

        //For Login
        else{
            User.findOne({username: username})
            .then(user => {

                let attemptPassword = password;
                if(!user){
                    return done(null, false, {message:'This username/password does not exist'})
                }
                else{
                    console.log("will verify now");

                    user.comparePassword(attemptPassword, function(err, isMatch) {
                        if (err){
                            console.log('hihi');

                            return done(null, false, {message:err})
                        }
                        if(!isMatch){

                            return done(null, false, {message:'This username/password does not exist'})
                        }
                        return done(null, user), {message:'Successfully Logged In'};
                    });
                }

            })
        }
    }  
));

module.exports = passport;

Index.js

代码语言:javascript
复制
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//expression session
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({mongooseConnection:mongoose.connection})
  }))

app.use(passport.initialize());
app.use(passport.session());
//express-router
const authRouter = require('./routes/auth-router');

app.use('/users',authRouter);


server.listen(PORT, () => console.log(`Server has started on port ${PORT}`));
EN

回答 1

Stack Overflow用户

发布于 2021-04-27 12:26:25

我想app.use(cors({凭据:true});会解决您的问题,gyus。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62096877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档