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中的非阻塞方法介绍
Jun 05 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
Nodejs关于gzip/deflate压缩详解
Mar 04 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
NodeJs实现简单的爬虫功能案例分析
Dec 05 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
Nodejs实现用户注册功能
Apr 14 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP 柱状图实现代码
2009/12/04 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
使用PHP开发留言板功能
2019/11/19 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
利用JQuery和JS实现奇偶行背景颜色自定义效果
2012/11/19 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
2017/06/28 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
JS函数节流和函数防抖问题分析
2017/12/18 Javascript
vue生命周期实例小结
2018/08/15 Javascript
js+html实现点名系统功能
2019/11/05 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
django将数组传递给前台模板的方法
2019/08/06 Python
python读取ini配置文件过程示范
2019/12/23 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
python 实现端口扫描工具
2020/12/18 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
百度软件工程师职位
2013/02/14 面试题
公司出纳岗位职责
2013/12/07 职场文书
保安拾金不昧表扬信
2014/01/15 职场文书
财务主管岗位职责
2014/02/28 职场文书
个人自我鉴定总结
2014/03/25 职场文书
财务管理专业求职信
2014/06/11 职场文书
趣味运动会开幕词
2015/01/28 职场文书
企业爱心捐款倡议书
2015/04/27 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python
VUE递归树形实现多级列表
2022/07/15 Vue.js