管理员的单独登录身份验证

时间:2019-01-03 10:26:42

标签: node.js express authentication routing

我能够成功为普通用户生成登录名。现在,我想为普通用户和管理员的登录屏幕使用相同的端点/login。我想用固定的电子邮件创建 user-admin ,并使用生成的令牌将灵活的密码固定。

我是Node.JS后端路由的新手。

这是我的登录路线:-

router.post('/login' , (req, res, next) => {

    User.find({email: req.body.email})
    .exec()
    .then(user => {
        if(user.length < 1) {
            return res.status(401).json({
                message: "Auth failed. User not found."
            })
        }
        bcrypt.compare(req.body.password, user[0].password, (err, result) =>{
            if (err) {
                return res.status(401).json({
                message: "Auth failed. Check email and password"
                });             
            }   
            if (result){
            const token = jwt.sign( 
                {
                    email: user[0].email,
                    userId: user[0]._id
                },
                process.env.JWT_KEY,
                {
                    expiresIn : "1h"
                });
                return res.status(200).json({
                message: "Auth Successful",
                token : token
                });
            }
        });
    })
    .catch(err =>{
        if (err.code == 500)
                    res.status(500).send(["Something went wrong in login"]);
            else
            return next(err);
    });
});

我需要为我的管理部分添加哪些内容?

编辑:-

user.model

var userSchema = new mongoose.Schema({
    fullName : {
                type: String,
                required: "Full name can't be empty"
                },
    email :     {
                type: String,
                required: "Email can't be empty",
                unique: true
                },
    password :  {
                type: String,
                required: "Password can't be empty",
                minlength: [6 ,"Password must be atleast 6 character long"]
                },  
    phoneNumber :   {
                type: String,
                required: "Reqired for further contact.Can't be empty"
                },
    saltSecret: String 
});

mongoose.model('User', userSchema);

user.controller

const mongoose = require ('mongoose');
const User = mongoose.model('User');
    module.exports.register = (req, res, next) =>{  

        var user = new User();
        user.fullName = req.body.fullName;
        user.email = req.body.email;
        user.password = req.body.password;
        user.phoneNumber = req.body.phoneNumber;
        user.save((err, doc) =>{
            if(!err)
                res.send(doc);
            else{
                if (err.code == 11000)
                        res.status(422).send(["Entered duplicate email address. Please check"]);
                else
                return next(err);
                }
        });
    }

1 个答案:

答案 0 :(得分:0)

您可以在role集合中添加一个附加字段Users,其中可以包含值useradmin(如果有更多角色,则为值数组)。 / p>

然后,当您创建JWT令牌时,可以向其中添加role字段。

const token = jwt.sign( 
{
    email: user[0].email,
    userId: user[0]._id,
    role: user[0].role
},
process.env.JWT_KEY,
{
    expiresIn : "1h"
});

现在,您可以使用此值来识别登录用户是否为admin。

您可能需要创建新的API,以将用户转换为管理员(更改角色字段),或者根据需要直接在数据库中执行。

如果您想完全通过代码处理admin逻辑(不对db进行任何修改),并且已经知道要分配为admin的用户的电子邮件ID,则可以使用以下逻辑。

const adminEmail = "admin@example.com";
const role = user[0].email===adminEmail? "admin" : "user";
const token = jwt.sign( 
{
    email: user[0].email,
    userId: user[0]._id,
    role
},
process.env.JWT_KEY,
{
    expiresIn : "1h"
});
相关问题