PassportJS身份验证

时间:2016-10-28 00:03:23

标签: node.js express passport.js

所以,我有一切正常工作,但它并没有显示它是一个认证用户,即使它到达适当的地方......

页面中的javascript代码验证登录

var  UserManager = {
    validateLogin : function (username, password) {
        var userData = {
            username: username,
            password: password
        }
        return new Promise(function(resolve, reject) {
            $.ajax({
                url: "/musicplayer/users/api/login",
                dataType: "json",
                data: userData,
                type: "POST",
                success: function loginSuccess(result, status, xhr) {
                    resolve(null);
                },
                error: function loginError(xhr, status, result) {
                    reject(new Error(result));
                },
            });
        });
    }

}

function userLogin(){
    UserManager.validateLogin($('#loginEmail').val(), $('#loginPassword').val()).then(function(response) {
        window.location = '/musicplayer/library'
    },
    function(error){
        $("#msgBox").messageBox({"messages" : error.message, "title" : "Warning", boxtype: 4 });
        $("#msgBox").messageBox("show");
    });
    return false;
}

local.strategy.js

var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var userLibrary = require('../../classes/music/userlibrary.js');

module.exports = function () {
    passport.use(new localStrategy(
        {
            usernameField: 'username',
            passwordField: 'password'
        },
        function(username, password, done) {
            //validating user here
            var userManager = new userLibrary.UserManager();
            userManager.login(username, password).then(
                function (user){
                    done(null, user);
                },
                function (reason){
                    if (reason.err) {
                        done(err, false, info);
                    }
                    else {
                        done(null, false, {message: reason.message});
                    }
                 }
            );
        })
    );
};

路由器

/******* validate the user login ********/
usersRouter.post('/api/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
            if (err) {
                console.log("Login Failed", err.message + " - " + err.stack);
                if (req.xhr){
                    res.status(500).send({ error: 'Internal Error' });
                }
                else {
                    next(err);
                }
            }
            else if (!err && !user){
                err = new Error();
                err.message = info.message;
                err.status = 401;
                console.log("Invalid Data", err.message);
                if (req.xhr){
                    res.status(401).send({ error: err.message });
                }
                else {
                    next(err);
                }
            }
            else if (user){
                console.log("Successful Login:", user);
                res.status(200).send({message: "successful"});
            }
        }
    )(req, res, next);
});

passport.js文件,其中包含我的中间件......

var passport = require("passport");

module.exports = function (app) {
    app.use(passport.initialize());
    app.use(passport.session());
    passport.serializeUser(function(user, done){
        done(null, user);
    });
    passport.deserializeUser(function(user, done){
        done(null, user);
    });

    require('./strategies/local.strategy')();

    app.all('/musicplayer/*', function (req, res, next){
        // logged in
        //need function for exceptions
        if (req.user || req.url === '/musicplayer/users/api/login' || req.url === '/musicplayer/users/signin') {
            next();
        }
        // not logged in
        else {
            // 401 Not Authorized
            var err = new Error("Not Authorized");
            err.status = 401;
            next(err);
        }
    });
}

Userlibrary /的UserManager 我正在使用promises来利用库的创建并处理我早期遇到的同步与异步问题......

var sqlite3 = require('sqlite3').verbose();

function User() {
    this.email = "";
    this.password = "";
    this.userid = "";
};

function UserManager () {
    this.user = new User();
};

UserManager.prototype.login = function (email, password) {
    var db = new sqlite3.Database('./data/MusicPlayer.db');
    params = {
        $email: email,
        $password: password
    }
    var self = this;
    return new Promise(function(resolve, reject){
        db.serialize(function () {
            db.get("SELECT * FROM users WHERE email = $email and password = $password", params, function (err, row) {
                db.close();
                if (!err && row) {
                    //log in passed
                    self.user.userid = row.userid;
                    self.user.email = row.email;
                    self.user.password = row.password;
                    resolve(self.user);
                }
                else if (!err) {
                    //log in failed log event
                    reject({
                        err: err,
                        message: null
                    });
                }
                else {
                    //error happened through out an event to log the error
                    reject({
                        message : "Email and/or Password combination was not found",
                        err : null
                    });
                }
            });
        });
    });

};

module.exports  = {
    User : User,
    UserManager : UserManager
}

现在,我已经调试了这个,它肯定会成功登录"

成功返回浏览器,浏览器说好了让我重定向到库页面(实际上只是一个空白页面)。当它进入我的图书馆页面时,我得到了一个未经授权的401。

因此,如果我在中间件内部进行调试以确保身份验证。我看看req.user并且它是未定义的,我尝试req.isAuthenticated()它返回一个false。

我想我一定错过了什么......

我想要的是一个全局身份验证,说这是这个人登录的。然后我会设置路由/路由基础说好,他们是否有权访问此页面或Web服务。

现在我坚持使用会话,因为在这个时间点学习网络令牌对我没用。

任何帮助都会受到赞赏......我一直在寻找那里的例子。但我发现的例子是" basic"示例没有人调用库来从数据库进行验证,或者他们没有尝试全局设置授权,而是逐个路由。

1 个答案:

答案 0 :(得分:1)

在搜索时我发现了这篇文章

https://github.com/jaredhanson/passport/issues/255

然后我在文档中找到了这个

app.get('/login', function(req, res, next) {
    passport.authenticate('local', function(err, user, info) {
        if (err) { return next(err); }
        if (!user) { return res.redirect('/login'); }
        req.logIn(user, function(err) {
              if (err) { return next(err); }
              return res.redirect('/users/' + user.username);
        });
      })(req, res, next);
});

这对我有用...我在使用自定义回调时基本上忘了做req.logIn方法....我知道这很简单......希望这有助于将来的某些人。