您的位置:首页 > Web前端 > Node.js

nodeJS---express4+passport实现用户注册登录验证

2016-09-12 10:26 831 查看
网上有很多关于passport模块使用方法的介绍,不过基本上都是基于express3的,本文介绍在express4框架中使用passport模块。

前言

passport是一个功能单一,但非常强大的一个模块,支持本地账号验证和第三方账号登录验证,本文将介绍使用passport实现用户注册检测,用户登录验证。

passport是使用”策略“来验证请求,策略是passport中最重要的概念。passport模块本身不能做认证,所有的认证方法都以策略模式封装为插件,需要某种认证时将其添加到package.json即可。

策略模式是一种设计模式,它将算法和对象分离开来,通过加载不同的算法来实现不同的行为,适用于相关类的成员相同但行为不同的场景,比如在passport中,认证所需的字段都是用户名、邮箱、密码等,但认证方法是不同的。

安装

1)先创建工程

fan@dev:~/nodejs$ express -e node_passport
fan@dev:~/nodejs$ cd node_passport/
fan@dev:~/nodejs/node_passport$npm install    //进入工程文件,安装依赖


2)安装passport

fan@dev:~/nodejs/node_passport$ npm install passport --save


3)安装插件

你最少需要安装一个passport策略来使用它,一般而言本地验证策略passport-local是必装的。

fan@dev:~/nodejs/node_passport$ npm install passport-local --save


基本使用方法

local本地验证

1)配置Strategies

本地验证默认是通过用户名和密码来验证的,代码如下:

assport.use(new LocalStrategy(
function(username, password, done) {
//操作
})
})


也可以通过配置,采用邮箱和密码来验证,本文要介绍的就是通过邮箱和密码验证。

代码如下:

passport.use('local.signup',new localStategy({
usernameField:'email',
passwordField:'password',
passReqToCallback:true  //此处为true,下面函数的参数才能有req
},function(req,email,password,done){
//....省略代码
})
})


注意:

passport.use的第一个参数是一个字符串,是用来标识验证方法的,因为一个工程中,可能会有多此验证,每次验证的逻辑会不一样,下面会一一讲解。

实例化的第一个参数是一个对象,在对象里面添加你要验证的字段,其中passReqToCallback项,默认为false,设置为true时可以将整个req传递给回调函数,这样在回调里就可以验证req中带的所有条件。

在工程中实现passport的配置:

新建一个config文件下,进入该文件夹目录下,新建passport.js文件:

fan@dev:~/nodejs/node_passport$ mkdir config
fan@dev:~/nodejs/node_passport$ cd config
fan@dev:~/nodejs/node_passport/config$ vim passport.js


passport.js代码如下:

var passport = require('passport');

var User = require("../models/user.js");
var localStategy = require('passport-local').Strategy;

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

passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});

passport.use('local.signup',new localStategy({
usernameField:'email',
passwordField:'password',
passReqToCallback:true  //此处为true,下面函数的参数才能有req
},function(req,email,password,done){
req.checkBody('email','您输入的email无效').notEmpty().isEmail();
req.checkBody('password',"您输入了无效密码").notEmpty().isLength({min:4});
var errors = req.validationErrors();
if(errors){
var messages = [];
errors.forEach(function(error){
messages.push(error.msg);
});
return done(null,false,req.flash('error',messages));
}
User.findOne({'email':email},function(err,user){
if(err){
return done(err);
}
if(user){
return done(null,false,{message:"此邮件已经被注册"});
}
var newUser = new User();
newUser.email = email;
newUser.password = newUser.encryptPassword(password);
newUser.save(function(err,result){
if(err){
return done(err);
}
return done(null,newUser);
});
});
}));

passport.use('local.login',new localStategy({
usernameField:'email',
passwordField:'password',
passReqToCallback:true  //此处为true,下面函数的参数才能有req
},function(req,email,password,done){
req.checkBody('email','您输入的email无效').notEmpty();
req.checkBody('password',"您输入了无效密码").notEmpty();
var errors = req.validationErrors();
if(errors){
var messages = [];
errors.forEach(function(error){
messages.push(error.msg);
});
return done(null,false,req.flash('error',messages));
}
User.findOne({'email':email},function(err,user){
if(err){
return done(err);
}
if(!user){
return done(null,false,{message:"用户名错误!"});
}
if(!user.validPassword(password)){
return done(null,false,{message:"密码错误!"});
}
return done(null,user);
});

}));


上面代码配置了用户注册时验证和用户登录时验证的策略,上面代码使用到:

 var User = require("../models/user.js");    //用户集合模型

newUser.encryptPassword()


user.validPassword()


 代码如下:

<%- include header %>

<form method="post">
<% if(hasError){ %>
<div class="alert alert-danger">
<% messages.forEach(function(item){ %>
<p> <%= item %> </p>
<% }) %>
</div>
<% } %>
邮箱: <input type="text" name="email" /><br/>
密码: <input type="password" name="password" /><br />
确认密码:<input type="password" name="password-repeat" /><br />
<input type="submit" value="注册" />
</form>

<%- include footer %>


View Code
测试:

在浏览器中输入localhost:3000/users/signup

密码位数少于4的情况(右图是提交之后的显示):





邮箱错误:





邮箱和密码都错误:





这里只举例用户的注册,用户登录其实也差不多,这里就不举例了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: