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服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
nodejs中实现sleep功能实例
Mar 24 NodeJs
3分钟快速搭建nodejs本地服务器方法运行测试html/js
Apr 01 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 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
国内咖啡文化
2021/03/03 咖啡文化
很好用的PHP数据库类
2009/05/27 PHP
PHP中去除换行解决办法小结(PHP_EOL)
2011/11/27 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
PHP正则表达式函数preg_replace用法实例分析
2020/06/04 PHP
javascript实现的距离现在多长时间后的一个格式化的日期
2009/10/29 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
js实现旋转木马效果
2017/03/17 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
layui 对table中的数据进行转义的实例
2019/09/12 Javascript
详解Python的Django框架中的模版相关知识
2015/07/15 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
Python中作用域的深入讲解
2018/12/10 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
前台接待员岗位职责
2014/01/02 职场文书
小学毕业家长寄语
2014/01/19 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
学者《孟子》名人名言
2019/08/09 职场文书