nodejs怎么实现登录认证?

更新日期: 2019-11-25阅读: 1.9k标签: 登录

当我们登录了一个网站,在没有退出登录的情况下,我们关闭了这个网站 ,过一段时间,再次打开这个网站,依然还会是登录状态。这是因为,当我们登录了一个网站,服务器会保存我们的登录状态,直到我们退出登录,或者保存的登录状态过期。

那服务器是通过什么存储我们的登录状态的呢? 答案就是Session,服务通过Session能够记录每个客户端连接的状态。关于Session的原理,在这就不多说了,本文主要介绍在Express框架中,如何使用Session来实现用户登录身份验证。


nodejs实现登录认证的方法如下:

1、环境配置:

在Node环境中, 并没有集成Express和Session的库,因此需要进行安装,首先进入建立一个项目目录,然后在项目根目录中,利用下面命令安装四个模块。

1) Express

该模块能够让我们快速的搭建一个 Web 开发框架。

2) body-parser

该模块是 Express 模块的中间件,方便我们解析浏览器发送来的 body 数据

3) express-session

该模块也是 Express 模块中间件,方便我们处理客户端的 session。

4) ejs

该模块是一个渲染引擎。 方便我们将后台变量数据绑定到前台页面上。

安装如下:

npm install express --save
npm install body-parser --save
npm install express-session --save
npm install ejs --save


2、登录与验证

Session能够标记客户端在服务器上的状态。利用这一点,我们能够实现客户端的登录验证。

Session登录验证的流程大致为:客户端若在未登录的状态下请求主页,那么服务器将该请求重定向到登录页面;客户端在登录后,服务器需要记录保存该客户端的登录状态,并给予一个活动期限,这样下一次服务器请求主页的时候,就能够判断该客户端的登录状态,若登录状态有效,直接返回客户端需要的页面,否则重定向到登录页面。

对于Session的过期时间,如果没有设置Session的过期时间,服务器会根据自己配置中默认有效期,将长期不与服务器交互的Session进行删除。

下面贴出实例代码,界面比较简单,服务器后台代码注释写的很清楚,因此就不再进行说明了。

项目的目录结构如下:


登录页面(login.html) 代码如下:

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">

    </style></head><body>
    <form action="/login" method="POST">
        用户名: <input type="text" name="username"/>  <br>
        密码: <input type="password" name="pwd"/>
        <input type="submit" value="Submit"/>
    </form>
</body>
</html>

主页(home.html)代码如下:

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>用户名:<span><%= username %> </span>  <a href="/logout">退出登录</a></div>
</body>
</html>

服务器(app.js)代码如下:

/**
 * Created by tjm on 9/7/2017.
 */var express = require('express');var app = express();
 var session = require('express-session');var bodyparser = require('body-parser');
 // 下面三行设置渲染的引擎模板
 app.set('views', __dirname); //设置模板的目录
 app.set('view engine', 'html');// 设置解析模板文件类型:这里为html文件
 app.engine('html', require('ejs').__express); // 使用ejs引擎解析html文件中ejs语法
 app.use(bodyparser.json()); // 使用bodyparder中间件,
 app.use(bodyparser.urlencoded({ extended: true }));// 使用 session 中间件
 app.use(session({    secret :  'secret', // 对session id 相关的cookie 进行签名
    resave : true,    saveUninitialized: false, // 是否保存未初始化的会话
    cookie : {        maxAge : 1000 * 60 * 3, // 设置 session 的有效时间,单位毫秒
    },
}));
// 获取登录页面
app.get('/login', function(req, res){
    res.sendFile(__dirname + '/login.html')
});
// 用户登录
app.post('/login', function(req, res){
    if(req.body.username == 'admin' && req.body.pwd == 'admin123'){
        req.session.userName = req.body.username; // 登录成功,设置 session
        res.redirect('/');
    }    else{
        res.json({ret_code : 1, ret_msg : '账号或密码错误'});// 若登录失败,重定向到登录页面
    }
});
// 获取主页
app.get('/', function (req, res) {
    if(req.session.userName){  
    //判断session 状态,如果有效,则返回主页,否则转到登录页面
        res.render('home',{username : req.session.userName});
    }else{
        res.redirect('login');
    }
})// 退出app.get('/logout', function (req, res) {
    req.session.userName = null; // 删除session
    res.redirect('login');
});

app.listen(8000,function () {    console.log('http://127.0.0.1:8000')
})

到此,session 实现登录验证就完成。上面的例子 session 是保存在服务内存中,当然还可以保存在文件或数据库中,只需要配置 session 中间件即可。

app.use(session({    
    secret: 'secretkey',    
    store: new MongoStore({       
    db: 'sessiondb'
    })
}));

上面的代码则是将 session 保存到 MongoDB 数据库。

链接: https://fly63.com/article/detial/7693

Web登录其实没那么简单

一个简单的HTML例子看看用户信息安全:标准的HTML语法中,支持在form表单中使用<input></input>标签来创建一个HTTP提交的属性,现代的WEB登录中,form表单会在提交请求时,会获取form中input标签存在name的属性,作为HTTP请求的body中的参数传递给后台,进行登录校验。

了解一下第三方登录

在我们的日常生活中,登录一个网站或 APP 时经常会选择微信、 QQ 或其他账号登录。这种情况我们就称为第三方登录。那么第三方登录的实现机制是什么呢?

微信网页登录逻辑与实现

现在的网站开发,都绕不开微信登录(毕竟微信已经成为国民工具)。虽然文档已经写得很详细,但是对于没有经验的开发者还是容易踩坑。所以,专门记录一下微信网页认证的交互逻辑

网站接入QQ登录功能

本文中所说的QQ登录功能,是采用官方的OAuth2.0来实现的,这样有更多的自主权。另一种较为简单的JS-SDK开发方式,虽然非常简便,但自主性不够,所以没有采用。下文中所构造的URL,均使用了JavaScript的ES6语法。

什么是单点登录?

在日常工作中,用户需要访问大量的信息资源,例如,用户首先要登录到操作系统中,然后进入各个应用系统。进入每一个系统都需要对用户的身份进行识别与验证,这样,用户需要提供多个用户帐号与口令,为了便于记忆

uniapp登录流程详解uni.login

微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见 普通浏览器上实现微信登陆,并非开放API,需要向微信申请,仅个别开发者有此权限 H5平台的其他登陆,比如QQ登陆、微博登陆,uni-app未封装

Web登录认证类漏洞分析防御总结和安全验证机制设计探讨

做渗透测试有一段时间了,发现登录方面的问题特别多,想做个比较全面点的总结,我尽量写的全面点又适合新人,这篇文章可能需要点想象力,因为问题比较多我不可能去海找各种例子举出来

node怎么做登录拦截?

利用 Express 中间件功能实现登录拦截。如果用户请求的路径需要登录后才能访问,将用户重定向到登录页面,登录成功后将用户重定向到原始请求路径。

单点登录是什么?三种情况的实现方式

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一,SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!