首页 > 其他分享 >无涯教程-ExpressJS - 身份验证

无涯教程-ExpressJS - 身份验证

时间:2024-01-30 16:32:40浏览次数:20  
标签:body res app req 身份验证 无涯 ExpressJS var id

为了创建身份验证系统,无涯教程需要创建一个注册页面和一个用户密码存储,以下代码创建了一个帐户并将其存储在内存中,这只是出于演示的目的;建议始终使用永久性存储(数据库或文件)来存储用户信息。

var express=require('express');
var app=express();
var bodyParser=require('body-parser');
var multer=require('multer');
var upload=multer(); 
var session=require('express-session');
var cookieParser=require('cookie-parser');

app.set('view engine', 'pug');
app.set('views','./views');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(upload.array());
app.use(cookieParser());
app.use(session({secret: "Your secret key"}));

var Users=[];

app.get('/signup', function(req, res){
   res.render('signup');
});

app.post('/signup', function(req, res){
   if(!req.body.id || !req.body.password){
      res.status("400");
      res.send("Invalid details!");
   } else {
      Users.filter(function(user){
         if(user.id === req.body.id){
            res.render('signup', {
               message: "User Already Exists! Login or choose another user id"});
         }
      });
      var newUser={id: req.body.id, password: req.body.password};
      Users.push(newUser);
      req.session.user=newUser;
      res.redirect('/protected_page');
   }
});

app.listen(3000);

现在为注册表单创建一个名为 signup.jade的新视图。

注册会员

html
   head
      title Signup
   body
      if(message)
         h4 #{message}
         form(action="/signup" method="POST")
         input(name="id" type="text" required placeholder="User ID")
         input(name="password" type="password" required placeholder="Password")
         button(type="Submit") Sign me up!

通过访问localhost:3000/signup检查此页面是否加载。

Signup form

为这两个字段都设置了必填属性。在具有以下内容的视图中创建一个名为 protected_pa​​ge.pug 的新文件-

html
   head
      title Protected page
   body
      div Hey #{id}, How are you doing today?
      div Want to log out?
      div Logout

仅当用户刚刚注册或登录时,此页面才应该可见。现在定义其路由以及登录和注销的路由-

var express=require('express');
var app=express();
var bodyParser=require('body-parser');
var multer=require('multer');
var upload=multer(); 
var session=require('express-session');
var cookieParser=require('cookie-parser');

app.set('view engine', 'pug');
app.set('views','./views');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(upload.array());
app.use(cookieParser());
app.use(session({secret: "Your secret key"}));

var Users=[];

app.get('/signup', function(req, res){
   res.render('signup');
});

app.post('/signup', function(req, res){
   if(!req.body.id || !req.body.password){
      res.status("400");
      res.send("Invalid details!");
   } else {
      Users.filter(function(user){
         if(user.id === req.body.id){
            res.render('signup', {
               message: "User Already Exists! Login or choose another user id"});
         }
      });
      var newUser={id: req.body.id, password: req.body.password};
      Users.push(newUser);
      req.session.user=newUser;
      res.redirect('/protected_page');
   }
});
function checkSignIn(req, res){
   if(req.session.user){
      next();     //If session exists, proceed to page
   } else {
      var err=new Error("Not logged in!");
      console.log(req.session.user);
      next(err);  //Error, trying to access unauthorized page!
   }
}
app.get('/protected_page', checkSignIn, function(req, res){
   res.render('protected_page', {id: req.session.user.id})
});

app.get('/login', function(req, res){
   res.render('login');
});

app.post('/login', function(req, res){
   console.log(Users);
   if(!req.body.id || !req.body.password){
      res.render('login', {message: "Please enter both id and password"});
   } else {
      Users.filter(function(user){
         if(user.id === req.body.id && user.password === req.body.password){
            req.session.user=user;
            res.redirect('/protected_page');
         }
      });
      res.render('login', {message: "Invalid credentials!"});
   }
});

app.get('/logout', function(req, res){
   req.session.destroy(function(){
      console.log("user logged out.")
   });
   res.redirect('/login');
});

app.use('/protected_page', function(err, req, res, next){
console.log(err);
   //User should be authenticated! Redirect him to log in.
   res.redirect('/login');
});

app.listen(3000);

无涯教程创建了一个中间件函数 checkSignIn 来检查用户是否已登录, protected_pa​​ge 使用此函数,为了注销用户,销毁了会话(session)。

现在创建登录页面。将视图命名为 login.pug ,然后输入内容-

html
   head
      title Signup
   body
      if(message)
         h4 #{message}
         form(action="/login" method="POST")
         input(name="id" type="text" required placeholder="User ID")
         input(name="password" type="password" required placeholder="Password")
         button(type="Submit") Log in

简单身份验证应用程序现已完成;现在测试该应用程序。使用 nodemon index.js 运行该应用程序,然后转到localhost:3000/signup。

输入用户名和密码,然后单击注册-

Protected page

现在退出该应用程序。这会将重定向到登录页面-

Auth login

该路由受到保护,这样,如果未经身份验证的人尝试访问它,他将被重定向到无涯教程的登录页面。

参考链接

https://www.learnfk.com/expressjs/expressjs-authentication.html

标签:body,res,app,req,身份验证,无涯,ExpressJS,var,id
From: https://blog.51cto.com/u_14033984/9489956

相关文章

  • 无涯教程-ExpressJS - Cookies
    Cookie是简单的files/data,随服务器请求发送到客户端并存储在客户端,每次用户重新访问网站时,该cookie都会与请求一起发送。要将Cookie与Express一起使用,无涯教程需要cookie解析器中间件。要安装它,请使用以下代码-npminstall--savecookie-parser现在要在Express中使用cookie,需......
  • 无涯教程-ExpressJS - 模板(Templating)
    Pug是Express的模板引擎,Pug是一个非常强大的模板引擎,具有多种函数,包括filter,includes,inheritance,interpolation等。要将Pug与Express一起使用,无涯教程需要安装它。npminstall--savepug现在已经安装了Pug,将其设置为您的应用程序的模板引擎。将以下代码添加到您的index.js文......
  • 无涯教程-ExpressJS - 中间件(Middleware)
    中间件(Middleware)函数是可以访问请求对象(requestobject),响应对象(responseobject)以及应用程序的请求(request)-响应(response)中的下一个中间件函数。这些函数用于修改req和res对象,以执行诸如解析请求正文(responstbodies),添加响应标头(responseheaders)等任务。这......
  • 无涯教程-ExpressJS - HTTP方法
    请求中提供了HTTP方法,该方法指定了客户端已请求的操作。下表列出了最常用的HTTP方法-S.No.Method&Remark1GETGET方法用于获取数据2POSTPOST方法用于提交数据3PUTPUT方法用于修改数据4DELETEDELETE方法用于删除数据GETMethodGET请求通过在请求的URL部......
  • 无涯教程-ExpressJS - 路由(Routing)
    Web框架在不同的路径上提供HTMLpage,script,images等资源,以下函数用于在Express应用程序中定义routes路由-app.method该方法可以应用于任何HTTP请求方法–get,set,put,delete,处理程序是一个回调函数,当在相关routes上找到匹配的请求类型时执行。如,varexpress=require('express'......
  • 无涯教程-Django - Apache配置
    到目前为止,在无涯教程的示例中,已经使用了DjangodevWeb服务器,但是此服务器仅用于测试,不适合生产环境。一旦投入生产,您就需要一个真实的服务器,如Apache,Nginx等,在本章中讨论Apache。通过Apache为Django应用提供服务是通过使用mod_wsgi完成的。因此,第一件事是确保您已安装Apache和......
  • 无涯教程-Swift - 修饰符
    协议中的常量,变量和函数受到限制,并允许通过访问控制以全局和局部方式进行访问。Swift4语言提供了三种不同的访问级别。它们是公共,内部和私有访问权限。S.NoAccessLevels&Definition1Public使实体可以在其定义模块的任何源文件中进行处理,而在导入定义模块的另一个模块......
  • 无涯教程-Swift - Generics(泛型)
    Swift4语言提供"Generic"函数来编写灵活且可重用的函数和类型,泛型用于避免重复并提供抽象,Swift4标准库是使用泛型代码构建的。Swift4s的"Arrays"和"Dictionary"类型属于Generic集合。funcexchange(a:inoutInt,b:inoutInt){lettemp=aa=bb=temp}varn......
  • 无涯教程-Swift - 类型转换
    为了验证的类型,"TypeCasting"以Swift4语言开始发挥作用,它用于检查类型是属于特定的超类还是子类,或者是否在其自己的层次结构中定义。Swift4类型转换提供两个运算符"is"来检查值的类型和"as",并将类型值转换为其他类型,类型转换还检查类型是否遵循特定的协议一致性标准。类层......
  • 无涯教程-Swift - 引用计数
    内存管理函数及其用法通过自动引用计数(ARC)以Swift4语言处理。ARC用于初始化和取消初始化系统资源,从而在不再需要时释放类使用的内存空间。ARC跟踪有关我们的代码之间的关系的信息,以有效地管理内存资源。ARC函数每次通过init()创建新的类时,ARC每次都会分配一块内存来存储信......