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 sublime text 3安装与配置
Jun 19 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs爬虫抓取数据乱码问题总结
Jul 03 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs创建简易web服务器与文件读写的实例
Sep 07 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
深入解析phpCB批量转换的代码示例
2013/06/27 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JS实现的简洁纵向滑动菜单(滑动门)效果
2015/10/19 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
vue-test-utils初使用详解
2019/05/23 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
八大排序算法的Python实现
2021/01/28 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
使用Django开发简单接口实现文章增删改查
2019/05/09 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
2019/11/25 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
css3 利用transform打造走动的2D时钟
2020/10/20 HTML / CSS
HTML5新增的Css选择器、伪类介绍
2013/08/07 HTML / CSS
银行毕业实习自我鉴定
2013/09/19 职场文书
自我鉴定怎么写
2013/12/05 职场文书
大学生职业生涯规划书前言
2014/01/09 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
2014年宣传部工作总结
2014/11/12 职场文书
2014年仓库管理工作总结
2014/12/17 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
格林童话读书笔记
2015/06/30 职场文书
消费者投诉书范文
2015/07/02 职场文书
安全教育培训制度
2015/08/06 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书