繁体   English   中英

PassportJS身份验证

[英]PassportJS authentication

因此,我可以正常工作,但即使它到达正确的地方,也不能表示它是经过身份验证的用户...

页面上的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我正在使用Promise ,以便能够利用库的创建并处理我在早期遇到的同步与异步问题...

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服务。

目前,我坚持使用所有会话,因为此时此刻学习Web令牌对我没有用。

任何帮助将不胜感激...我一直在这里寻找例子。 但是我发现的示例是“基本”示例,没有人调用库从数据库进行验证,或者他们没有尝试全局设置授权,而是尝试逐条路由。

搜索后,我发现了这篇文章

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方法。...我知道这很简单...希望这对以后有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM