nodeJS---express4+passport实现用户注册登录验证
2016-09-12 10:26
831 查看
网上有很多关于passport模块使用方法的介绍,不过基本上都是基于express3的,本文介绍在express4框架中使用passport模块。
passport是使用”策略“来验证请求,策略是passport中最重要的概念。passport模块本身不能做认证,所有的认证方法都以策略模式封装为插件,需要某种认证时将其添加到package.json即可。
策略模式是一种设计模式,它将算法和对象分离开来,通过加载不同的算法来实现不同的行为,适用于相关类的成员相同但行为不同的场景,比如在passport中,认证所需的字段都是用户名、邮箱、密码等,但认证方法是不同的。
2)安装passport
3)安装插件
你最少需要安装一个passport策略来使用它,一般而言本地验证策略passport-local是必装的。
本地验证默认是通过用户名和密码来验证的,代码如下:
也可以通过配置,采用邮箱和密码来验证,本文要介绍的就是通过邮箱和密码验证。
代码如下:
注意:
passport.use的第一个参数是一个字符串,是用来标识验证方法的,因为一个工程中,可能会有多此验证,每次验证的逻辑会不一样,下面会一一讲解。
实例化的第一个参数是一个对象,在对象里面添加你要验证的字段,其中passReqToCallback项,默认为false,设置为true时可以将整个req传递给回调函数,这样在回调里就可以验证req中带的所有条件。
在工程中实现passport的配置:
新建一个config文件下,进入该文件夹目录下,新建passport.js文件:
passport.js代码如下:
上面代码配置了用户注册时验证和用户登录时验证的策略,上面代码使用到:
var User = require("../models/user.js"); //用户集合模型
代码如下:
View Code
测试:
在浏览器中输入localhost:3000/users/signup
密码位数少于4的情况(右图是提交之后的显示):
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102139008-1601436231.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102205805-1296432698.png)
邮箱错误:
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102257555-1158052483.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102307961-1548793519.png)
邮箱和密码都错误:
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102404680-797324210.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102412695-1720333991.png)
这里只举例用户的注册,用户登录其实也差不多,这里就不举例了。
前言
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的情况(右图是提交之后的显示):
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102139008-1601436231.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102205805-1296432698.png)
邮箱错误:
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102257555-1158052483.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102307961-1548793519.png)
邮箱和密码都错误:
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102404680-797324210.png)
![](https://images2015.cnblogs.com/blog/990444/201609/990444-20160912102412695-1720333991.png)
这里只举例用户的注册,用户登录其实也差不多,这里就不举例了。
相关文章推荐
- Yii2系列教程四:实现用户注册,验证,登录
- Node.js+Express+MySql实现用户登录注册功能
- Yii2本身自带实现用户注册,验证,登录
- nodejs使用express,crypto配合validator实现用户登录逻辑
- 用JavaScript实现用户登录验证、注册信息格式检验(附代码)
- express4+passport实现用户注册登录验证
- Servlet实现用户的登录注册+sqlite数据库验证
- nodejs使用express,crypto配合validator实现用户登录逻辑
- Node.js+Express+MySql实现用户登录注册
- Yii开发系列2:实现用户注册验证登录
- Android基础学习总结(十二)——利用Bmob实现用户账户体系(注册、登录、验证等)
- 使用Forms Authentication实现用户注册、登录 (三)用户实体替换
- 设置Microsoft SQL Server Management Studio Express--使用SQL验证登录(如使用sa用户登录)
- 在jsp中用bean和servlet联合实现用户注册、登录
- 使用Forms Authentication实现用户注册、登录 (三)用户实体替换
- xmlhttp-JS-实现用户是否注册无刷新验证
- 使用Forms Authentication实现用户注册、登录 (一)基础知识
- 使用Forms Authentication实现用户注册、登录 (二)用户注册与登录
- Ajax实现客户端验证用户注册
- 图文演示Flash+ASP实现用户登录/注册程序第1/2页