用户登录权限

news2024/10/5 21:18:16

文章目录

    • @[TOC](文章目录)
  • 前言
  • 一、鉴权
  • 二、 Cookie与session
    • 1.HTTP无状态
    • 2.cookie的重要属性
    • 3.cookie 和 session 的生命周期
      • 3.1 cookie 生命周期影响因素
      • 3.2 session 生命周期影响因素
    • 4.cookie 和 session 的区别
    • 5.工作原理
    • 3 用户登录Node.js和Express验证session
  • 三、JSON Web Token
    • 1. JWT 介绍
    • 2. JWT 组成部分
    • 3.JWT 的原理
    • 4.用户登录Node.js和Express验证JWT
  • 四、补充token
    • 什么是 token(令牌)?
      • Accesss Token
      • Refresh Token

前言

本文记录了用户登录的鉴权方式,以及相关知识点的记录。


一、鉴权

  • 鉴权:对用户访问系统进行权限控制

1. 什么是认证?

  • 验证当前用户的身份
  • 互联网常用认证:
    1.用户名密码登录
    2.邮箱发送登录链接
    3.手机号接收验证码

2. 什么是授权?

  • 用户授予第三方应用访问该用户某些资源的权限
  • 实现授权的方式:cookie、session、token、OAuth

3. 什么是凭证?

  • 实现认证的授权的媒介

二、 Cookie与session

  • cookie和session是来实现状态的记录,都是由服务器生成,用来存储特定的值。
  • 一般情况下,在服务器端,session的存储方式:文件方式、数据库方式,用 sessionId 来识别。
  • 客户端(浏览器)在发送请求的时候,会自动将存活、可用的cookie封装在请求头(headers)中和请求一起发送。

1.HTTP无状态

  • HTTP 协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息。这样一些交互业务就无法支撑。

2.cookie的重要属性

属性说明
name = value键值对,设置cookie的名称,字符串类型
domain指定cookie所属域名
path指定cookie在哪个路由下生效,默认’/’
maxAgecookie失效时间,单位秒。整数:cookie在maxAge秒后失效;负数:关闭浏览器即失效,浏览器不保存该cookie;0:删除cookie;默认-1
expires过期时间
securecookie是否被使用安全协议(HTTPS,SSL)传输。
httpOnly一定程度上防止XSS攻击

3.cookie 和 session 的生命周期

3.1 cookie 生命周期影响因素

  • cookie自身的存活时间:是服务器生成cookie时去设定的。
  • 客户端是否保留cookie。对客户端自身有影响,对其它封包工具无影响。

3.2 session 生命周期影响因素

  • 服务器对于session对象保存的最大时间设置。
  • 客户端进程是否关闭。对客户端自身有影响,对其它封包工具无影响。

4.cookie 和 session 的区别

  • 存储位置:cookie 是存在客户端,session是存在服务端。
  • 安全性:session 比 cookie 更安全。
  • 存储内容:Session中存储的是对象,而Cookie中存储的是字符串。
  • 保持时间:Session随会话结束而关闭,而Cookie可以长期保存在客户端,除非被设置过期或者被删除。
  • 对服务器压力:每个用户都会产生一个session,如果并发访问的用户过多,就会产生非常多的session,耗费大量的内存。

为什么session 比 cookie 更安全?

  • cookie 是存储在客户端的,可见、可改变。
  • session 存储在服务器端,不可见,不可改变。

5.工作原理

1、用户向服务器发送用户名和密码。
2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。
3、服务器向用户返回一个 session_id,写入用户的 Cookie。
4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。
5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

在这里插入图片描述

3 用户登录Node.js和Express验证session

  • express 引入会自动生成加密的 sessionId, 然后校验session
const express = require("express");
const session = requrie("express-session");
const MongoStore = require("connect-mongo")
const app = express();
//注册session
app.use(
	session({
	secret:"this is session",//服务器生成session
	resave:true,
	saveUninitialized:true,//强制将初始化的session 存储
	cookie:{
		maxAge:100 * 60 * 10, //过期时间
		secure:false, //为true的时候只有 https 协议才能访问cookie
	},
	rolling:true, //true:超时前刷新,cookie会重新计时
	//false:超时前刷新多次,按第一次刷新计时
	store:MongoStore.create({
		mongoUrl:'mongodb://127.0.0.1:27017/vv_session',
		ttl: 1000 * 60 * 10, //过期时间
		}),
	})
);
//设置session
app.use((req,res,next)=>{
	if(req.url === "/login"){
		next()
		return;
	}
	if(req.session.user){
		req.session.garbage = Date();
		next();
	}else{
		res.redirect("/login")
	}
})
//注销session


三、JSON Web Token

1. JWT 介绍

  • JSON Web Token(JWT),又称为JSON令牌,是一种用于在网络应用之间安全地传输信息的开放标准(RFC 7519)。它将用户信息加密到token里,服务器不保存任何用户信息;服务器通过使用保密的密钥验证token的正确性,正确 放行。(目前最流行的跨域认证解决方案)

2. JWT 组成部分

  • Header (头部):是一个 JSON 对象,通常由 token 类型和签名算法名两部分组成。
    { "alg": "HS256", //示签名的算法(algorithm) "typ": "JWT" //表示这个令牌(token)的类型(type) }
  • Payload(载荷):也是一个 JSON 对象,用来存放实际需要传递的数据,通常会被base64url编码

JWT 规定了7个官方字段

  • iss (issuer):签发人
  • exp (expiration time):过期时间
  • sub (subject):主题
  • aud (audience):受众
  • nbf (Not Before):生效时间
  • iat (Issued At):签发时间
  • jti (JWT ID):编号
  • Signature(签名):将Header和Payload部分组合起来,防止数据篡改。

3.JWT 的原理

在这里插入图片描述

  • JWT认证流程
  • 用户输入用户名/密码登录,服务端认证成功,返回给客户端一个JWT
  • 客户端将 token 保存到本地
  • 当用户访问一个受保护的路由或者资源的时候,需要请求头的Authorization字段中使用 Bearer 模式添加JWT
  • 服务端的保护路由将会检查请求头Authorization中的JWT信息,合法,允许用户的行为。

为什么要使用JWT?

  • 相比XML格式,JSON更加简洁,编码之后更小,使JWT更加适合在HTML和HTTP环境中传递。
  • 因为JWT是自包含的(内部包含一些会话信息),减少了查询数据库的需要
  • JWT 不使用cookie,在使用域名提供的API服务不需要担心跨域资源共享问题。
  • JWT 是一种无状态的认证机制,用户状态不再存储在服务器的内存中。
    安全性更好

在这里插入图片描述

4.用户登录Node.js和Express验证JWT

const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const secretKey = 'your-secret-key';

// 中间件:验证JWT
const verifyToken = (req, res, next) => {
  const token = req.headers.authorization;

  if (!token) {
    return res.status(401).json({ message: '无法验证身份' });
  }

  jwt.verify(token, secretKey, (err, decoded) => {
    if (err) {
      return res.status(401).json({ message: '身份验证失败' });
    }
    req.user = decoded;
    next();
  });
};

// 路由:受保护的资源
app.get('/protected', verifyToken, (req, res) => {
  res.json({ message: '欢迎访问受保护的资源', user: req.user });
});

// 路由:生成JWT
app.post('/login', (req, res) => {
  const user = { id: 1, username: 'user123' };
  const token = jwt.sign(user, secretKey, { expiresIn: '1h' });
  res.json({ token });
});

app.listen(3000, () => {
  console.log('服务器运行在端口 3000');
});

四、补充token

什么是 token(令牌)?

Accesss Token

  1. 访问资源接口(API)时所需的资源凭证

token组成

  • uid:用户唯一的身份标识
  • time:当前时间的时间戳
  • sign:签名
  1. token 的验证流程
    在这里插入图片描述
  • 客户端使用用户名、密码请求登录
  • 服务端收到请求,验证用户名、密码
  • 验证成功,服务端签发一个 token 并发送给客户端
  • 客户端收到 token,将其存储在 cookie或者localStorage 中
  • 客户端每次向服务端请求资源,带着服务签发的 token
  • 服务端收到请求,验证客户端请求里的 token,成功,返回请求数据给客户端。

Refresh Token

  • refresh token 是专用于刷新 accesss token的token,解决了每次刷新都需要用户输入用户名、密码的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习-聚类问题

前言 聚类算法又叫做”无监督分类“,目标是通过对无标记训练样本来揭示数据的内在性质及 规律,为进一步的数据分析提供基础。 Kmeans 作为聚类算法的典型代表,Kmeans可以说是最简单的聚类算法,没有之一,那她是怎么完…

力扣111. 二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2 示例 2: 输入…

Win7告诉你如何扩大c盘空间

Win7告诉你如何扩大c盘空间 C盘是指电脑硬盘主分区之一,一般用于储存或安装系统使用。很多文件都默认安装到c盘,导致c盘空间严重不足,那么如何扩大c盘空间呢?接下来,小编就教你扩大c盘空间的具体步骤 怎么给C盘扩容呢&…

关于加密解密,加签验签那些事

面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口&#xff…

LinuxBasicsForHackers笔记 --Python 脚本基础

添加Python模块 Python 有一个专门用于安装和管理 Python 包的包管理器,称为 pip(Pip Installs Packages)。由于我们在这里使用 Python 3,因此您将需要 Python 3 的 pip 来下载和安装软件包。默认情况下应包含 Pip,但…

利用C语言模拟实现堆的基本操作和调堆算法

利用C语言模拟实现堆的基本操作和调堆算法 文章目录 利用C语言模拟实现堆的基本操作和调堆算法前言一、堆的基本原理大根堆和小根堆的比较 二、实现堆的基本操作1)结构定义2)初始化堆(HeapInit)3)销毁堆(He…

智能抠图软件有哪些?不妨试试这四款AI抠图工具

你知道的智能抠图软件有哪些?随着 AI 技术的迅速发展,许多图像处理任务都可以交由 AI 自动完成,例如修图、抠图、高清修复等。AI 图像工具不仅将我们从单调重复的工作中解放出来,而且其处理图像的效果和效率也往往优于人工。最近&…

docker的资源控制:

docker的资源控制: 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

nginx中的正则表达式及location和rewrite

目录 常用的Nginx 正则表达式 location和rewrite的区别 location location 大致可以分为三类 location 常用的匹配规则 location 优先级 location 示例说明 location优先级的总结 rewrite rewrite的功能 rewrite实现跳转的条件 rewrite的执行顺序 rewrite的语法格式…

mysql:查询当前登录的用户

可以使用USER()函数查询当前登录的用户,例如:

Axure->Axure安装,Axure菜单栏和工具栏功能介绍,页面及概要区

Axure安装Axure菜单栏和工具栏功能介绍,页面及概要区 1.Axure安装 即时设计 - 可实时协作的专业 UI 设计工具 (js.design) 点击上方下载安装⬆ 打开软件点击帮助->管理授权-> 被授权人 Axure 授权密钥:gjqpIxSSUUqFwPoZPi8XwBBhRE2VNmOQsrord0JqShk4QCXxrw6…

Java智慧校园-中小学校园管理系统源码

智慧校园系统是通过信息化手段,实现对校园内各类资源的有效集成 整合和优化,实现资源的有效配置和充分利用,将校务管理过程的优化协调。为校园提供数字化教学、数字化学习、数字化科研和数字化管理。 致力于为家长和教师提供一个全方位、多层…

天池SQL训练营(四)-集合运算-表的加减法和join等

-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…

2023年度盘点:智能汽车、自动驾驶、车联网必读书单

【文末送书】今天推荐几本自动驾驶领域优质书籍 前言 2023年,智能驾驶和新能源汽车行业仍然有着肉眼可见的新进展。自动驾驶技术继续尝试从辅助驾驶向自动驾驶的过渡,更重要的是相关技术成本的下降。根据《全球电动汽车展望2023》等行业报告&#xff0c…

centos7进程管理

什么是进程 进程是已启动的可执行程序的运行实例,是程序运行的过程,动态的,有生命周期及运行状态。 ​ 程序: 二进制文件,静态 静态查看进程 查看进程(一) [rootzaotounan ~]# ps aux ps :pro…

upload-labs

01 随便上传个文件 发现对于上传类型有限制 查看页面代码发现是js的过滤直接关闭js 上传成功 右键图片在新建标签页打开文件 这里直接抓包改名字也行 02 抓包修改后缀名 03 发现后端做了检测抓包修改失败 大小写绕过失败,php特性php1等会被当成php执行 这里图片的…

RE2文本匹配调优实战

引言 在RE2文本匹配实战的最后,博主说过会结合词向量以及其他技巧来对效果进行调优,本篇文章对整个过程进行详细记录。其他文本匹配系列实战后续也会进行类似的调优,方法是一样的,不再赘述。 本文所用到的词向量可以在Gensim训练…

如何用CHAT写方案?

问CHAT:帮我写一份航空无动力乐园的可执行方案 CHAT回复: 方案一:概念及地点筛选 航空无动力乐园是指以航空运动为主题,利用自然地形与风力进行滑翔、跳伞等无动力航空运动的户外休闲娱乐乐园。鉴于此,首需要确定乐园…

裸机单片机适用的软件架构

单片机通常分为三种工作模式,分别是 1、前后台顺序执行法 2、操作系统 3、时间片轮询法 1、前后台顺序执行法 利用单片机的中断进行前后台切换,然后进行任务顺序执行,但其实在…

windows错误事件 98、41、7000、55、153解决办法

事件错误:98、55、153 疑难解答清单 在系统事件日志中,搜索新技术文件系统 (NTFS) 和磁盘相关的警告和错误。 例如,事件 ID 55、153 或 98。 管理员身份打开CMD,运行命令 chkdsk /scan 并检查结果。 该 chkdsk /scan 命令是只读…