Паспорт и JWT аутентификация и авторизация - PullRequest
0 голосов
/ 21 апреля 2020

Пожалуйста, кто-нибудь может взглянуть на эти строки кода ... Одна работает, а другая не будет работать. Я пытаюсь выяснить причину, почему. в одном случае в модели есть объект username для пользователей. в то время как в другом есть имя объекта в отличие от имени пользователя. У каждой модели есть свой телефонный объект. Таким образом, в первом случае пользователь настроен для входа с телефоном и паролем.

В этом случае сервер возвращает ошибку неверного запроса. Пожалуйста, смотрите код ниже

//routes/User.js

const express = require('express');
const userRouter = express.Router();
const passport = require('passport');
const passportConfig = require('../passport');
const JWT = require('jsonwebtoken');
const User = require('../models/User');
const Todo = require('../models/Transaction');


const signToken = userID =>{
    return JWT.sign({
        iss : "comparelight",
        sub : userID
    },"comparelight",{expiresIn : "1h"});
}

userRouter.post('/register',(req,res)=>{
    const { phone,password,name, role, disco, meter, email } = req.body;
    User.findOne({phone},(err,user)=>{
        if(err)
            res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
        if(user)
            res.status(400).json({message : {msgBody : "Username is already taken", msgError: true}});
        else{
            const newUser = new User({phone,password,name, role, disco, meter, email});
            newUser.save(err=>{
                if(err)
                    res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
                else
                    res.status(201).json({message : {msgBody : "Account successfully created", msgError: false}});
            });
        }
    });


<!-- begin snippet: js hide: false console: true babel: false -->
   // passport.js

   const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;
const User = require('./models/User');

const cookieExtractor = req =>{
    let token = null;
    if(req && req.cookies){
        token = req.cookies["access_token"];
    }
    return token;
}

// authorization 
passport.use(new JwtStrategy({
    jwtFromRequest : cookieExtractor,
    secretOrKey : "comparelight"
},(payload,done)=>{
    User.findById({_id : payload.sub},(err,user)=>{
        if(err)
            return done(err,false);
        if(user)
            return done(null,user);
        else
            return done(null,false);
    });
}));

// authenticated local strategy using phone and password
passport.use(new LocalStrategy((phone,password,done)=>{
    User.findOne({phone},(err,user)=>{
        // something went wrong with database
        if(err)
            return done(err);
        // if no user exist
        if(!user)
            return done(null,false);
        // check if password is correct
        user.comparePassword(password,done);

    });
}));

Но в другом случае пользователь настроен на вход с именем пользователя и паролем. И это работает. Пожалуйста, смотрите код ниже.

  //routes/User.js

const express = require('express');
const userRouter = express.Router();
const passport = require('passport');
const passportConfig = require('../passport');
const JWT = require('jsonwebtoken');
const User = require('../models/User');
const Todo = require('../models/Transaction');


const signToken = userID =>{
    return JWT.sign({
        iss : "comparelight",
        sub : userID
    },"comparelight",{expiresIn : "1h"});
}

userRouter.post('/register',(req,res)=>{
    const { username,password,phone, role, disco, meter, email } = req.body;
    User.findOne({username},(err,user)=>{
        if(err)
            res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
        if(user)
            res.status(400).json({message : {msgBody : "Username is already taken", msgError: true}});
        else{
            const newUser = new User({phone,password,username, role, disco, meter, email});
            newUser.save(err=>{
                if(err)
                    res.status(500).json({message : {msgBody : "Error has occured", msgError: true}});
                else
                    res.status(201).json({message : {msgBody : "Account successfully created", msgError: false}});
            });
        }
    });
});

userRouter.post('/login',passport.authenticate('local',{session : false}),(req,res)=>{
    if(req.isAuthenticated()){
       const {_id,username,role} = req.user;
       const token = signToken(_id);
       res.cookie('access_token',token,{httpOnly: true, sameSite:true}); 
       res.status(200).json({isAuthenticated : true,user : {username,role}});
    }
});

    // passport.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const JwtStrategy = require('passport-jwt').Strategy;
const User = require('./models/User');

const cookieExtractor = req =>{
    let token = null;
    if(req && req.cookies){
        token = req.cookies["access_token"];
    }
    return token;
}

// authorization 
passport.use(new JwtStrategy({
    jwtFromRequest : cookieExtractor,
    secretOrKey : "comparelight"
},(payload,done)=>{
    User.findById({_id : payload.sub},(err,user)=>{
        if(err)
            return done(err,false);
        if(user)
            return done(null,user);
        else
            return done(null,false);
    });
}));

// authenticated local strategy using username and password
passport.use(new LocalStrategy((username,password,done)=>{
    User.findOne({username},(err,user)=>{
        // something went wrong with database
        if(err)
            return done(err);
        // if no user exist
        if(!user)
            return done(null,false);
        // check if password is correct
        user.comparePassword(password,done);
        
    });
}));

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...