Node.js 高级篇(五):实现 cookie 身份验证

cookie-session 是一个简单的基于 cookie 的会话中间件。

使用 cookie 可以通过两种主要方式存储用户会话:在服务器上或在客户端上。此模块将客户端上的会话数据存储在 cookie 中,而诸如express-session之类的模块 仅将客户端上的会话标识符存储在 cookie 中,并将会话数据存储在服务器上,通常存储在数据库中。

以下几点可以帮助您选择使用哪个:

  • cookie-session不需要服务器端的任何数据库/资源,但总会话数据不能超过浏览器的最大 cookie 大小。
  • cookie-session可以简化某些负载均衡的场景。
  • cookie-session可用于存储“轻量级”会话并包含一个标识符以查找数据库支持的辅助存储以减少数据库查找。

安装

npm i cookie-session

API

var cookieSession = require('cookie-session')
var express = require('express')

var app = express()

app.use(cookieSession({
    
    
  name: 'session',
  keys: [/* secret keys */],

  // Cookie Options
  maxAge: 24 * 60 * 60 * 1000 // 24 hours
}))

cookieSession

使用提供的选项创建一个新的cookie会话中间件。这个中间件将把属性会话附加到req上,req提供了一个表示加载的会话的对象。如果在请求中没有提供有效的会话,则该会话是一个新的会话,或者是从请求中加载的会话。

如果req.session内容被改变,中间件会自动在响应中添加一个Set-Cookie头。请注意,除非会话中有内容,否则响应中不会出现任何标头(因此不会为特定用户创建会话),所以如果您有要为会话存储的标识信息,一定要添加一些东西到 req.session

选项

Cookie 会话在选项对象中接受如下属性:

name

name: 要设置的 cookie 的名称,默认为session.

keys

用于签署和验证 cookie 值或配置 Keygrip实例的密钥列表。设置的 cookie 始终使用 签名keys[0],而其他密钥对验证有效,允许密钥轮换。如果Keygrip提供了实例,则可以使用它来更改签名参数,例如签名的算法。

secret

keys如果未提供将用作单个键的字符串。

Cookie 选项

  • maxAge: 从Date.now()开始表示过期时间的毫秒数
  • expires: 一个Date表示 cookie 过期日期的对象(默认在会话结束时过期)。
  • path: 表示 cookie 路径的字符串(/默认情况下)。
  • domain: 表示 cookie 域的字符串(无默认值)。
  • sameSite: 一个布尔值或字符串,指示 cookie 是否为“同一站点”cookie(false默认情况下)。这可以设置为'strict''lax''none'true(映射到'strict')。
  • secure: 一个布尔值,指示 cookie 是否仅通过 HTTPS 发送(false默认为 HTTP,true默认为 HTTPS)。如果设置为true并且 Node.js 不是直接通过 TLS 连接,请务必阅读如何在代理后面设置 Express,否则 cookie 可能无法正确设置。
  • httpOnly: 一个布尔值,指示 cookie 是否仅通过 HTTP(S) 发送,而不提供给客户端 JavaScript(true默认情况下)。
  • signed: 一个布尔值,指示是否要对 cookie 进行签名(true默认情况下)。
  • overwrite: 一个布尔值,指示是否覆盖以前设置的同名 cookie(true默认情况下)。

销毁会话

要销毁会话,只需将其设置为null

req.session = null

使用

登录

login.js

const cookieSession = require('cookie-session')
const express = require('express')
const bodyParser = require('body-parser')

const app = express()

app.use(bodyParser.urlencoded({
    
     extended: false }))

app.set('trust proxy', 1) // trust first proxy

app.use(cookieSession({
    
    
  name: 'mySession',
  keys: ['key1', 'key2'],
  // Cookie Options
  maxAge: 24 * 60 * 60 * 1000 // 24 hours
}))

app.post('/login', function (req, res, next) {
    
    
  req.session.username = req.body.username

  res.send({
    
    flag: 1, data: {
    
    }})
})

app.listen(3000)

在这里插入图片描述在这里插入图片描述

退出登录

logout.js

const logout = async (req, res, next) => {
    
    
  res.set('Content-Type', 'application/json; charset=utf-8')
  req.session = null
  res.render('success', {
    
    
    data: JSON.stringify({
    
    })
  })
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41887214/article/details/123980025