Node.js Express使用Passport中间件实现登录注册身份验证

 

简介

用户登录注册身份验证是大家可能平时不会考虑太多的事情之一,但是几乎每个网站或应用程序都需要它。如果必须自己实现身份验证,会很困难吗?我想是不会的,由于这种功能非常普遍,我遇到的每种语言/web框架几乎都有现成的解决方案,对于Node,我们就可以使用Express Passport插件来实现

其实我们可以完全放心的使用这些插件包等,毕竟经过很多人的实践才避免了我们在代码中查找BUG和漏洞的痛苦

 

Node.js Express使用Passport中间件实现登录注册身份验证

Passport中间件是什么?

Passport 包是一个可扩展的、模块化的节点身份验证中间件。当大多数人想到身份验证时,他们想到的是传统的用户名和密码组合。虽然这仍然非常流行,但是使用其他服务通过 OAuth 对用户进行身份验证已经成为另一种流行的方法。Passport是一个可扩展的中间件,它允许你插入500多个不同的身份验证提供者,如Facebook、Twitter、谷歌等,其中大多数都使用OAuth标准

然而,并非所有的策略都使用OAuth。你还可以选择基于散列(hash-based)的(通过查询字符串、POST数据或HTTP头文件传递散列)、 JSON web tokens ,甚至 HTTP Basic authentication (如http://username:password@example.com/)。尽管其中一些策略可能采用不同的参数,但它们在很大程度上是相同的,因此如果需要,你应该能够轻松地改变这些策略

Node.js Express使用Passport中间件实现登录注册身份验证 - 豆豆网

怎么使用Passport中间件?

要使用Passport,你需要将其引入到Express应用程序,就像引入其他中间件一样:

var express = require('express');  
var passport = require('passport');

var app = express();

app.configure(function() {  
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'derpy' }));

    app.use(passport.initialize());
    app.use(passport.session());    // 持久登录会话所需(可选,推荐)
});

注意,如果决定启用sessions,那么需要在passport.session()之前使用express.session()来确保用户的登录会话顺序被正确的存储

在大多数情况下,必须启用sessions,否则在请求之间会丢失用户

初始化Passport并设置会话之后,就可以设置策略了。就像前面说的,大多数策略非常类似于setup-wise,来看看最常用的策略LocalStrategy:

var LocalStrategy = require('passport-local').Strategy;

// Express/Passport 设置

passport.use(new LocalStrategy(  
    {
        usernameField: 'email',
        passwordField: 'password'
    },
    function(email, password, done) {
        User.loadOne({ email: email }).then(function(user) {
            if (!user || !user.authenticate(password)) {
                return done(null, false, { message: '电子邮件或密码不正确!' });
            }

            done(null, user);
        });
    })
);

User.loadOne……部分将取决于于你的应用程序(我在这里使用 Camo ODM)。回调将用户的用户名/电子邮件和密码发送给你,在“Local Strategy”的情况下,该用户名/电子邮件和密码是通过名为电子邮件和密码的输入字段从提交的表单数据中得到的

这些数据来自的HTML表单:

<form method="post" role="form">  
    <input type="text" name="email"/>
    <input type="password" name="password"/>
    <button type="submit">Login</button>
</form>

请注意,字段名为email和password,就像我们在上面的LocalStrategy中指定的那样

Passport通过从req中提取这封电子邮件和密码,我们可以在数据库中查找用户,然后将给定的密码与从数据库中获得的密码进行对比(这是密码的 salted hash)。将一个有效的user对象返回给done回调函数,会告诉Passport凭证是有效的。否则,返回false和错误消息

需要做的最后一件事是告诉Passport如何序列化和反序列化用户对象。这意味着Passport需要你告诉它如何仅用字符串(比如ID或电子邮件地址)唯一标识用户

// Express/Passport 设置

// Passport strategy 设置

passport.serializeUser(function(user, done) {  
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {  
    User.loadOne({ _id: id }).then(function(user) {
        done(null, user);
    }).catch(function(err) {
        done(err, null);
    });
});

在上面的serializeUser函数中,我们已经从数据库中找到了用户数据,需要告诉Passport在cookie中使用什么信息来唯一标识用户,示例中是user.id

对于反序列化用户,Passport获得cookie字符串(用户ID),需要将其转换为用户对象。因此,我们使用id在数据库中查找用户。在这里返回的内容作为req.user在每个请求中传递到路由

 

结论

大多数web应用程序和许多本地应用程序都使用某种形式的身份验证,所以让Passport为你处理所有的困难工作是很方便的

并不是说你需要更多的动机来使用Passport,但值得注意的是正确地进行身份验证是非常困难的,而且由于Passport是用户敏感数据的守门人,你最好选择一个经过全面测试和验证的中间件来实现~

 

转载请注明出处豆豆网

欢迎分享至:

版权声明:原创文章自由转载-非商用-非衍生-保持署名及文章出处(创意共享3.0许可证
转载说明:转载请注明出处豆豆网
部分文章选自网络(文首、末未标明豆豆网的均来自网络),我们对文中观点保持中立,本站涉及软件下载,仅供参考学习、交流之目的,涉及版权请告知删除,邮箱地址:豆豆网博客


发表评论

邮箱地址不会被公开。 必填项已用*标注