Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)

简介: Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)

一、SSO介绍

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。


如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。

1、使用SSO的好处
  • 方便用户 用户使用应用系统时,能够一次登录,多次使用。用户不再需要每次输入用户名称和用户密码,也不需要牢记多套用户名称和用户密码。单点登录平台能够改善用户使用应用系统的体验。
  • 方便管理员 系统管理员只需要维护一套统一的用户账号,方便、简单。相比之下,系统管理员以前需要管理很多套的用户账号。每一个应用系统就有一套用户账号,不仅给管理上带来不方便,而且,也容易出现管理漏洞。
  • 简化应用系统开发 开发新的应用系统时,可以直接使用单点登录平台的用户认证服务,简化开发流程。单点登录平台通过提供统一的认证平台,实现单点登录。因此,应用系统并不需要开发用户认证程序。


二、中间件介绍

1、Express

Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。

安装
npm install express
导入
const express = require('express')
使用
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.post('/', (req, res) => {
  res.send('Got a POST request')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

2、cors

cors 是 Express 的一个第三方中间件。通过安装和配置 cors 中间件,可以很方便地解决跨域问题。


CORS (Cross-Origin Resource Sharing,跨域资源共享)由一系列 HTTP 响应头组成,这些 HTTP 响应头决定浏览器是否阻止前端 JS 代码跨域获取资源。

安装
npm install cors
导入
const cors = require('cors')
配置
  • 启用所有 CORS 请求
app.use(cors())
  • 指定URL配置
app.use(cors({ origin: 'http://127.0.0.1:5500' }))
  • 为单个路由启用 CORS
app.get('/data', cors(), (req, res) => {
  res.json({
    name: 'cors in node.js',
    language: 'JavaScript',
    server: 'Express.js',
  })
})
  • 使用选项配置 CORS
const options = {
  origin: 'http://127.0.0.1:5500',
  methods: 'GET, PUT',
}
app.use(cors(options))
  • 使用函数配置动态 CORS 源
const options = {
  origin: dynamicConfiguration(),
  methods: 'GET, PUT',
}
 
const dynamicConfiguration = async (req) => {
  const db = getDB() // simulating database object
  let origin = await db.getOrigin(req.headers) //simulating fetching origin from DB based on the headers
  return origin
}
 
app.use(cors(options))

3、express-session

express-session中间件将会话数据存储在服务器上;它仅将会话标识(而非会话数据)保存在 cookie 中。从1.5.0版本开始, express-session不再依赖cookie-parser,直接通过req/res读取/写入;默认存储位置内存存储(服务器端)

安装
npm install express-session
导入
const session = require('express-session')
配置
app.use(session({
    secret: 'YOUR_SESSION_SECRET',//加密字符串。 使用该字符串来加密session数据,自定义
    resave: false,//强制保存session即使它并没有变化
    saveUninitialized: true,//强制将未初始化的session存储。当新建了一个session且未设定属性或值时,它就处于未初始化状态。
    cookie: {
        maxAge: 30 * 60 * 1000
    }
}))
使用
//设置
req.session.userName = userName;
//获取
const userName = req.session.userName
4、jsonwebtoken

JSON Web Token(JWT)是一种用于在web上传递信息的标准,它以JSON格式表示信息,通常用于身份验证和授权。


JWT由三个部分组成:Header(头部)、Payload(负载)和Signature(签名)。它们用点号分隔开,形成了一个JWT令牌。

在现代web应用中,用户身份认证是非常重要且必不可少的一环。而使用Node.js和Express框架,可以方便地实现用户身份认证。而在这个过程中,jsonwebtoken这个基于JWT协议的模块可以帮助我们实现安全且可靠的身份认证机制,可以让我们轻松地生成、解析和验证JWT。

安装
npm install jsonwebtoken
导入
const jwt = require('jsonwebtoken')
使用
// 生成token
const token = jwt.sign({
    id: 'appId',
    name: 'zhangsan',
    secret: 'YOUR_SECRET_KEY'
}, '123456', {
    expiresIn: '2h'
})
    
//验证token
jwt.verify(token, 'shhhhh', (err, decoded) => {
  if (err) {
    console.error('无效的令牌');
  } else {
    // 使用解码后的令牌数据
    console.log(decoded);
  }
});
5、jwt和session对比
对比因素 JWT Session
存储 存储在客户端,不需要服务器保持会话状态。 存储在服务器,需要服务器维护会话信息。
安全性 加密较严密,但如果token被窃取,攻击者可以任意使用。 如果sessionID被窃取,攻击者可以冒充用户登陆。
性能 在每次请求时需要验证和解码token,性能较差。 只需查找sessionID就能获取会话信息,性能较好。
扩展性 在多服务器或者跨域环境中更易扩展。 在多服务器环境中需要同步session,扩展性较差。
数据大小 JWT的大小比sessionID大,因此需要更多的带宽。 sessionID大小稳定,对带宽需求较小。
到期时间 可以为每个token设置不同的过期时间。 所有session的过期时间通常相同。
客户端存储位置 可以存储在Cookie, LocalStorage, SessionStorage中 存储在Cookie中。
跨域问题 无跨域问题,且对于移动应用而言友好。 跨域问题复杂,需要服务器支持CORS。
状态 无状态,服务器不需要保存用户信息。 有状态,服务器需要保存用户信息。
使用场景 用于认证和信息交换,尤其适合单页应用(SPA)和前后端分离的项目。 主要用于记录用户状态,适配传统的后端渲染的Web服务。



Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(二):https://developer.aliyun.com/article/1628446

目录
打赏
0
0
0
0
12
分享
相关文章
|
5月前
|
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(二)
Node.js单点登录SSO详解:Session、JWT、CORS让登录更简单(一)
138 0
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
106 23
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
43 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
【YashanDB知识库】安装共享集群时报错:YAS-05721 invalid input parameter, reason: node name invalid
|
2月前
|
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
nodejs安装之npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED reason: certificate has expired-证书错误通用问题解决方案-优雅草央千澈
484 26
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
323 58
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
68 2
2024年5月node.js安装(winmac系统)保姆级教程
NodeJs的安装
文章介绍了Node.js的安装步骤和如何创建第一个Node.js应用。包括从官网下载安装包、安装过程、验证安装是否成功,以及使用Node.js监听端口构建简单服务器的示例代码。
NodeJs的安装

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等