Nodejs进阶:express+session实现简易登录身份认证


Posted in NodeJs onApril 24, 2017

文档概览

本文基于express、express-session实现了简易的登录/登出功能,完整的代码示例可以在这里找到。

环境初始化

首先,初始化项目

express -e

然后,安装依赖。

npm install

接着,安装session相关的包。

npm install --save express-session session-file-store

session相关配置

配置如下,并不复杂,可以见代码注释,或者参考官方文档。

var express = require('express');
var app = express();
var session = require('express-session');
var FileStore = require('session-file-store')(session);

var identityKey = 'skey';

app.use(session({
  name: identityKey,
  secret: 'chyingp', // 用来对session id相关的cookie进行签名
  store: new FileStore(), // 本地存储session(文本文件,也可以选择其他store,比如redis的)
  saveUninitialized: false, // 是否自动保存未初始化的会话,建议false
  resave: false, // 是否每次都重新保存会话,建议false
  cookie: {
    maxAge: 10 * 1000 // 有效期,单位是毫秒
  }
}));

实现登录/登出接口

创建测试账户数据

首先,在本地创建个文件,来保存可用于登录的账户信息,避免创建链接数据库的繁琐。

// users.js
module.exports = {
  items: [
    {name: 'chyingp', password: '123456'}
  ]
};

登录、登出接口实现

实现登录、登出接口,其中:

  1. 登录:如果用户存在,则通过req.regenerate创建session,保存到本地,并通过Set-Cookie将session id保存到用户侧;
  2. 登出:销毁session,并清除cookie;
var users = require('./users').items;

var findUser = function(name, password){
  return users.find(function(item){
    return item.name === name && item.password === password;
  });
};

// 登录接口
app.post('/login', function(req, res, next){
  
  var sess = req.session;
  var user = findUser(req.body.name, req.body.password);

  if(user){
    req.session.regenerate(function(err) {
      if(err){
        return res.json({ret_code: 2, ret_msg: '登录失败'});        
      }
      
      req.session.loginUser = user.name;
      res.json({ret_code: 0, ret_msg: '登录成功'});              
    });
  }else{
    res.json({ret_code: 1, ret_msg: '账号或密码错误'});
  }  
});

// 退出登录
app.get('/logout', function(req, res, next){
  // 备注:这里用的 session-file-store 在destroy 方法里,并没有销毁cookie
  // 所以客户端的 cookie 还是存在,导致的问题 --> 退出登陆后,服务端检测到cookie
  // 然后去查找对应的 session 文件,报错
  // session-file-store 本身的bug  

  req.session.destroy(function(err) {
    if(err){
      res.json({ret_code: 2, ret_msg: '退出登录失败'});
      return;
    }
    
    // req.session.loginUser = null;
    res.clearCookie(identityKey);
    res.redirect('/');
  });
});

登录态判断

用户访问 http://127.0.0.1:3000 时,判断用户是否登录,如果是,则调到用户详情界面(简陋无比);如果没有登录,则跳到登录界面;

app.get('/', function(req, res, next){
  var sess = req.session;
  var loginUser = sess.loginUser;
  var isLogined = !!loginUser;

  res.render('index', {
    isLogined: isLogined,
    name: loginUser || ''
  });
});

UI界面

最后,看下登录、登出UI相关的代码。

<!DOCTYPE html>
<html>
<head>
  <title>会话管理</title>
</head>
<body>

<h1>会话管理</h1>

<% if(isLogined){ %>
  <p>当前登录用户:<%= name %>,<a href="/logout" rel="external nofollow" id="logout">退出登陆</a></p>
<% }else{ %>
  <form method="POST" action="/login">
    <input type="text" id="name" name="name" value="chyingp" />
    <input type="password" id="password" name="password" value="123456" />
    <input type="submit" value="登录" id="login" />
  </form>
<% } %> 

<script type="text/javascript" src="/jquery-3.1.0.min.js"></script>
<script type="text/javascript">
  $('#login').click(function(evt){
    evt.preventDefault();

    $.ajax({
      url: '/login',
      type: 'POST',
      data: {
        name: $('#name').val(),
        password: $('#password').val()
      },
      success: function(data){
        if(data.ret_code === 0){
          location.reload();
        }  
      }
    });
  });
</script>

</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Windows 系统下设置Nodejs NPM全局路径
Apr 26 NodeJs
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
Mar 28 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs搭建本地服务器并访问文件操作示例
May 11 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 NodeJs
nodejs入门教程五:连接数据库的方法分析
Apr 24 #NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 #NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 #NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 #NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 #NodeJs
nodejs 终端打印进度条实例代码
Apr 22 #NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 #NodeJs
You might like
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
jquery实现垂直和水平菜单导航栏
2020/08/27 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python实现ping的方法
2015/07/06 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python pillow模块使用方法详解
2019/08/30 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
生产副总岗位职责
2013/11/28 职场文书
协议书模板
2014/04/23 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
车队安全员岗位职责
2015/02/15 职场文书
会议主持人开场白台词
2015/05/28 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
python编写函数注意事项总结
2021/03/29 Python
python 实现的截屏工具
2021/05/08 Python
SpringBoot项目中控制台日志的保存配置操作
2021/06/18 Java/Android