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使用mysql模块之获得更新和删除影响的行数的方法
Mar 18 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
NodeJS测试框架mocha入门教程
Mar 28 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
Feb 02 NodeJs
关于NodeJS中的循环引用详解
Jul 23 NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 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实现WEB动态网页静态
2006/10/09 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
php进程间通讯实例分析
2016/07/11 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
浅谈jQuery中对象遍历.eq().first().last().slice()方法
2014/11/26 Javascript
Underscore源码分析
2015/12/30 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
浅谈一种让小程序支持JSX语法的新思路
2019/06/16 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python利用flask sqlalchemy实现分页效果
2020/08/02 Python
Django 使用logging打印日志的实例
2018/04/28 Python
使用Python来开发微信功能
2018/06/13 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
Python中super函数用法实例分析
2019/03/18 Python
在 Python 中接管键盘中断信号的实现方法
2020/02/04 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
金融专业推荐信
2013/11/14 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
毕业自我鉴定书
2014/03/24 职场文书
社区戒毒工作方案
2014/06/04 职场文书
保险公司开门红口号
2014/06/21 职场文书
四风问题查摆材料
2014/08/25 职场文书
农村优秀教师事迹材料
2014/08/27 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
房屋授权委托书范本
2014/10/07 职场文书
党员个人党性分析材料
2014/12/18 职场文书
督导岗位职责范本
2015/04/10 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
MySql学习笔记之事务隔离级别详解
2021/05/12 MySQL
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android