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(三)--- Node.js模块
May 25 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
浅谈Nodejs观察者模式
Oct 13 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
第三节--定义一个类
2006/11/16 PHP
解决form中action属性后面?传递参数 获取不到的问题
2017/07/21 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
jquery弹出遮掩层效果【附实例代码】
2016/04/28 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
python正则中最短匹配实现代码
2018/01/16 Python
使用python编写监听端
2018/04/12 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python 字典访问的三种方法小结
2019/12/05 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Python加速程序运行的方法
2020/07/29 Python
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
毕业生医学检验求职信
2013/10/16 职场文书
办公室前台岗位职责范本
2013/12/10 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
优良学风班总结材料
2014/02/08 职场文书
十一酒店活动方案
2014/02/20 职场文书
高校教师岗位职责
2014/03/18 职场文书
美容院合作经营协议书
2014/10/10 职场文书
授权委托书协议书
2014/10/16 职场文书
保证书格式
2015/01/16 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
JavaScript实现队列结构过程
2021/12/06 Javascript
vue判断按钮是否可以点击
2022/04/09 Vue.js
Python开发五子棋小游戏
2022/04/28 Python