【问题标题】:User Authentication with Node.js使用 Node.js 进行用户身份验证
【发布时间】:2017-04-06 02:41:53
【问题描述】:

我正在使用护照进行用户身份验证。首先,我创建了一个默认管理员用户。现在这个管理员必须能够创建用户,但不能创建任何其他用户。为此,我在数据库中创建了一个管理员用户。现在我的问题是如何由管理员创建其他用户,并且只有这个管理员应该有权访问所有 API 的路由,而不是任何其他用户如何保护 API 的?在 server.js 文件中,我将中间件函数创建为

//Catch unauthorized errors
app.use(function (err, req, res, next) {
    if(err.name === 'UnauthorizedError') {
        res.status(401);
        res.json({"message": err.name + ":" + err.message});
    }
});

请帮忙。希望大家不要介意发布这么长的文件。

'authentication.js'

'use strict';
var passport = require('passport'),
    mongoose = require('mongoose'),
    Users = mongoose.model('Users');


var authentication = {

    register: function(req, res, name, email, password) {
        var userData = req.body;

        var user = new Users({
            email: userData.email,
            name: userData.name,
        });

        user.setPassword(userData.password);

        if(!user) {
            res.status(400).send({error: 'All fields required'});
        }

        user.save(function(err, result) {
            if(err) {
                console.log('Could not save the User');
                res.status(500).send({error: 'Could not save the User'});
            }else {
                res.send('New User Created Successfully');
            }
        });
    },

    login: function (req, res) {
        if(!req.body.email || !req.body.password) { 
            res.status(400).send({"message": "All fields required"});
            return;    
        }

        passport.authenticate('local', function (err, user, info) { 
            var token;

            if (err) { 
        res.status(404).send({err: 'An Error Occured'});
                return;
            }

            if(user) { 
                token = user.generateJwt();
        res.status(300).send({"token": token});
            }else { 
        res.status(401).send('Unauthorized User');
            }
        });
    }

};

module.exports = authentication;

'user-model.js'

'use strict';
var mongoose = require('mongoose'),
    crypto = require('crypto'),
    jwt = require('jsonwebtoken'),
    Schema = mongoose.Schema;

var userSchema = new mongoose.Schema({
    email: { 
        type: String,
        required: true,
        unique: true
    },
    name: { 
        type: String,
        required: true
    },
    hash: String, 
    salt: String
});



userSchema.methods.setPassword = function (password) {
    this.salt = crypto.randomBytes(16).toString('hex'); 
    this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex'); 
};

//Validating a submitted password
userSchema.methods.validPassword = function (password) {
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    return this.hash === hash;
};

//Generating a JSON Web Token
userSchema.methods.generateJwt = function () {
    var expiry = new Date();
    expiry.setDate(expiry.getDate() + 7);

    return jwt.sign({ 
        _id: this._id,
        email: this.email, 
        name: this.name,   
        exp: parseInt(expiry.getTime() / 1000) 
    }, process.env.JWT_SECRET); 
};

var User = mongoose.model('Users', userSchema);
var user = new User();
user.name = 'Arjun Kumar';
user.email = 'arjun@kumar.com';
user.setPassword('myPassword');
user.save();

'user-route.js'

'use strict';
var express = require('express'),
    userRoute = express.Router(),
    jwt = require('express-jwt'),
    authentication = require('../controllers/authentication');

var auth = jwt({
    secret: process.env.JWT_SECRET,
    userProperty: 'payload'
});

userRoute.post('/:adminuserid/register', auth, authentication.register)
    .post('/login', authentication.login);

module.exports = userRoute;

'passport.js'

var passport = require('passport'),
    LocalStrategy = require('passport-local').Strategy,
    mongoose = require('mongoose'),
    Users = mongoose.model('Users');

passport.use(new LocalStrategy({usernameField: 'email'}, function (username, password, done) {
    Users.findOne({ email: username }, function (err, user) { 
        if (err) {
            return done(err);
        }
        if (!user) {                    
            return done(null, false, {
                message: 'Incorrect username.'
            })
        }
        if (!user.validPassword(password)) { 
            return done(null, false, {      
                message: 'Incorrect password.'
            });
        }
        return done(null, user);
    });
}));

【问题讨论】:

    标签: node.js mongodb authentication express passport.js


    【解决方案1】:

    您可以做一件事,将所有功能置于这样的条件中,仅授予管理员访问权限:

     If(req.user.email === your admin email) {
    
    Your function 
    
    }
    

    这应该在您希望只有管理员可以访问的路由下。

    或者,如果您有多个管理员,那么您应该稍微改变您的架构并添加一个admin : Number,您可以稍后声明,例如任何具有admin:1 的用户都是系统管理员,否则不是。

    希望我正确理解了您的问题。

    祝你好运

    【讨论】:

    • 阿米拉尼,感谢您的回复。你能说我需要把这个条件放在哪里吗?
    • 如果你使用 express,那么在创建管理路由时使用它。
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 2020-10-22
    • 2017-11-19
    相关资源
    最近更新 更多