在本教程中,我们将从Scratch开发一个Node.js应用程序,并使用流行的身份验证中间件护照来照顾我们的身份验证问题。
Passport的文档将其描述为“节点的简单,不引人注目的身份验证中间件”,这是正确的。
通过将自己作为中间件提供,Passport在将Web应用程序的其他问题与其身份验证需求中分离出来,做得非常出色。它可以轻松地将护照配置到任何基于Express的Web应用程序中,就像我们配置了其他Express中间件一样,例如记录,脱身,饼干放松和会话处理。
该教程对Node.js和Express框架具有基本的了解,以保持对身份验证的关注,尽管我们确实从头开始创建一个示例Express应用程序。我们将通过向其添加路线并验证其中一些路线来保护该应用程序。
护照为我们提供了500种身份验证机制可供选择。您可以针对本地或远程数据库实例进行身份验证,也可以使用OAUTH提供商进行Facebook,Twitter,Google等使用单个登录,以使用您的社交媒体帐户进行身份验证。
但是请放心:您不需要包括您的应用程序不需要的任何策略。所有这些策略彼此独立,并作为单独的节点模块包装,这些模块默认不包含在安装Passport的中间件时:NPM install Express -Save -Save -Save -Save -Save
您还可以使用以下代码段安装Express-Generator:
成功身份验证后,使用Passport后,使用SerializeUser函数将用户的数据持续到会话中,并使用以下代码段创建文件init.js :
var user = require('../ models/user');<br><br> Module.exports = function(Passport){<br><br> //护照需要能够序列化和应对用户的序列化以支持持续的登录会话<br> Passport.Serializeuser(功能(用户,完成){<br> console.log('序列化用户:',用户);<br> 完成(null,user._id);<br> });<br><br> Passport.Deserializeuser(功能(ID,完成){<br> user.findbyid(id,function(err,用户){<br> console.log('Queperialization用户:',用户);<br> 完成(err,用户);<br> });<br> });<br> }<br>
We will now define Passport's strategies for handling login and signup . Each of them would be an instance of the Local Authentication Strategy of Passport and would be created using the npm i connect-flash .
Create a login.js file in the bcryptjs by executing the command passport.use() function.
var bcrypt = require('bcrypt-nodejs');<br><br> Module.exports = function(Passport){<br><br> Passport.USE('login',...)<br> );<br><br> var Isvalidpassword =函数(用户,密码){<br> 返回bcrypt.comparesync(密码,user.password);<br> }<br> }<br>
如果您对代码片段感到不安,并且更喜欢查看正在使用的完整代码,请随时在此处浏览代码。
现在,我们在应用程序的视图文件夹中创建一个Ingrup.js文件,我们应该查看.jade文件。 Jade是一种模板引擎,主要用于node.js中的服务器端模板。这是使用Express动态编写标记和渲染页面的有力方法。与使用静态HTML文件相比,它具有更大的灵活性。要了解有关Jade及其工作原理的更多信息,您可以查看文档。
接下来,我们为应用程序创建以下四个视图:
Doctype HTML<br> html<br> 头<br> 标题=标题<br> 链接(rel ='stylesheet',href ='/stylesheets/style.css')<br> 链接(rel ='stylesheet',href ='http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css')<br> 身体<br> 块内容<br>
In the index.jade file, we will include the following code snippets:
扩展布局<br><br>块内容<br> Div.Container<br> Div.Row<br> Div.COL-SM-6.COL-MD-4.COL-MD-FORKSET-4<br> h1.text-center.login-title登录我们的护照应用<br> Div.Account-Wall<br> img(class='profile-img', src='https://lh5.googleusercontent.com/-b0-k99FZlyE/AAAAAAAAAAI/AAAAAAAAAAA/eu7opA4byxI/photo.jpg?sz=120')<br> form(class ='form-signin',action ='/login',method ='post')<br> 输入(type ='text',name ='username'class ='form-control',占位符='email',必需,自动对焦)<br> 输入(type ='密码',name ='password'class ='form-control',占位符='密码',必需)<br> 按钮(class ='btn btn-lg btn-primary btn-block',type ='submit')登录<br> SPAN.CLEARFIX<br> a(href ='/imp.',class ='文本中心new-account')创建一个帐户<br> #信息<br> 如果消息<br> h1.text-center.error-message#{messages}<br>
In the register.jade file, we'll include the following code snippets:
扩展布局<br><br>块内容<br> Div.Container<br> Div.Row<br> Div.COL-SM-6.COL-MD-4.COL-MD-FORKSET-4<br> h1.text-center.login-title注册细节<br> Div.Signup-Wall<br> form(class ='form-signin',action ='/imbip',method ='post')<br> 输入(type ='text',name ='username',class ='form-control',占位符='用户名',必需,autococus)<br> 输入(type ='password',name ='密码',class ='form-control nomargin',占位符='密码',必需)<br> 输入(type ='email',name ='email',class ='form-control',占位符='电子邮件',必需)<br> 输入(type ='text',name ='firstName',class ='form-control',占位符='名字',必需)<br> 输入(type ='text',name ='lastname',class ='form-control',占位符='姓氏',必需)<br> 按钮(class ='btn btn-lg btn-primary btn-block',type ='submit')注册<br> SPAN.CLEARFIX<br> #信息<br> 如果消息<br> h1.text-center.error-message#{messages}<br>
In the home.jade file, we'll include the following code snippets:
扩展布局<br><br>块内容<br> Div.Container<br> Div.Row<br> Div.COL-SM-6.COL-MD-4.COL-MD-FORKSET-4<br> #用户<br> h1.text-center.login-title欢迎#{user.firstname}。在下面查看您的详细信息:<br> Div.Signup-Wall<br> ul.user-details<br> li用户名--->#{user.username}<br> 李电子邮件--->#{user.email}<br> 李名字--->#{user.firstname}<br> li姓氏--->#{user.lastname}<br> a(href ='/nignout',class ='文本中心new-account')登录<br>
现在,注册页面看起来像这样:
登录页面看起来像这样:
详细信息页面看起来像这样:
护照是中间件,使得可以根据请求和响应对象添加某些属性和方法。护照具有非常方便的request.logout()
方法,除其他属性外,用户会话无效。
因此,很容易定义注销路线:
/ *处理注销 */<br> router.get('/nignout',函数(req,res,sext){<br> req.logout(function(err){function(err){<br> if(err){返回next(err); }<br> res.redirect('/')<br> }))<br> });<br>
护照还赋予了保护对匿名用户不适合的路线的访问的能力。这意味着,如果用户试图访问http:// localhost:3000/home而不在应用程序中进行认证,则将将其重定向到主页。
/ *获取主页 */<br> router.get('/home',iSauthenticated,功能(req,res){<br> res.render('home',{用户:req.user});<br> });<br><br> //与任何中间件一样,典型地调用Next()<br> //如果用户已验证<br>var isauthentication =函数(req,res,next){<br> if(req.isauthenticated())<br> 返回next();<br> res.redirect('/');<br> }<br>
护照并不是在验证Node.js应用程序时唯一的参与者,而是模块化,灵活性,社区支持以及它只是中间件使Passport成为一个不错的选择的事实。
有关护照和Everyauth的详细比较,这是Passport自己的开发人员的有趣且有益的观点。
您可以在我们的github存储库中找到该示例的完整源代码。
如果您想查看其他可以使用node.js做什么,请查看Envato市场上的Node.js项目的范围,从响应式AJAX联系表到URL缩短器,甚至是数据库CRUD GENTATOR。
这篇文章已通过玛丽·奥科逊(Mary Okosun)的贡献进行了更新。 Mary是位于尼日利亚拉各斯的软件开发人员,在Node.js,JavaScript,MySQL和NOSQL Technologies中具有专业知识。
以上是带有护照的身份验证node.js应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!