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 相关文章推荐
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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
php实现的任意进制互转类分享
2015/07/07 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
Date对象格式化函数代码
2010/07/17 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
jQuery点击弹出层弹出模态框点击模态框消失代码分享
2017/01/21 Javascript
详解Vue用axios发送post请求自动set cookie
2017/05/10 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
python使用os模块的os.walk遍历文件夹示例
2014/01/27 Python
python各种语言间时间的转化实现代码
2016/03/23 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python读取excel指定列数据并写入到新的excel方法
2018/07/10 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
实例详解Python装饰器与闭包
2019/07/29 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
升职自荐信范文
2013/10/05 职场文书
高中生毕业自我鉴定
2013/10/10 职场文书
室内设计专业个人的自我评价
2013/10/19 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
尼克胡哲观后感
2015/06/08 职场文书
初三语文教学反思
2016/03/03 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle