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学习笔记之Connect中间件应用实例
Jan 27 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
nodejs中Express与Koa2对比分析
Feb 06 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 NodeJs
浅谈Node的内存泄露问题
May 06 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
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
php+ajax 实现输入读取数据库显示匹配信息
2015/10/08 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
JavaScript编程学习技巧汇总
2016/02/21 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
2018/08/08 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
vue proxy 的优势与使用场景实现
2020/06/15 Javascript
python实现linux下使用xcopy的方法
2015/06/28 Python
python处理html转义字符的方法详解
2016/07/01 Python
Python登录注册验证功能实现
2018/06/18 Python
django的settings中设置中文支持的实现
2019/04/28 Python
python制作朋友圈九宫格图片
2019/11/03 Python
Python bytes string相互转换过程解析
2020/03/05 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
2020/05/03 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
flask框架中的cookie和session使用
2021/01/31 Python
2019年分享net面试的经历和题目
2016/08/07 面试题
财务会计专业推荐信
2013/11/30 职场文书
品质主管岗位职责
2014/03/16 职场文书
供应链金融服务方案
2014/05/25 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
python tkinter模块的简单使用
2021/04/07 Python
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
python not运算符的实例用法
2021/06/30 Python
python中 Flask Web 表单的使用方法
2022/05/20 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android