Web API接口鉴权方式

news2025/1/16 13:50:26

一、什么是鉴权?为什么要鉴权

鉴权(authentication),也叫做认证,即验证用户是否拥有访问系统的权利。

HTTP本身是无状态的请求,每次请求都是一次性的,并不会知道请求前后发生了什么。但在很多情况情况下都需要维护状态,最典型的就是用户登录系统,并在系统中进行一系列操作

API接口直接暴露在互联网上是存在安全风险的,如果不进行鉴权,就有可能被网上的不法分子恶意攻击(如:爬虫,恶意访问等),使得api资源被非法访问占用,正常用户访问受阻。因此鉴权十分必要,只有鉴权成功的请求才能请求服务,否则就被拦截
请添加图片描述

二、Cookie/Session鉴权

为每个用户颁发一个身份牌

为了识别用户,可以为每个用户设置一个“身份牌”,“身份牌”里面可以存放用户的信息,每次请求的时候都带上这个“身份牌”,这样就可以用来识别用户了。而这个“身份牌”就是我们经常提到的“cookie”
请添加图片描述

Session会话的引入

随着web应用的告诉发展,越来越多的用户信息需要存储,如果仅仅依靠Cookie字段存储,会大大增加每次请问的负担。
因此引入会话(session)的概念,使用一个会话ID(sessionID)映射到用户的各种信息上,每次请求只需要在cookie携带上sessionID就可以解决cookie增长的问题
请添加图片描述

为了更好的负载均衡与容灾,后端服务器一般使用分布式方式部署,一个用户的Session信息在单台服务器上创建后需要同步给其余的服务器。因此Session映射采用Redis等缓存服务器方式才能解决跨地域多机房问题
(为了负载均衡与容灾,Redis集群也需要使用多机房部署)
请添加图片描述

局限

  • 依赖cookie,cookie可以被禁用,也可以被劫持篡改
  • 移动端中cookie和session机制不被支持,跨平台不好兼容
  • 缓存服务器的多机房信息同步需要时间,如果服务某个机房出现问题,依然可能造成用户Session短暂失败

二、token授权之JWT

分散压力

既然基于cookie的session鉴权存在上述问题,那么能否改变一下思路,跳出以上的局限性。
Session会话机制的痛点在于,Session的用户解析需要后端服务来维护逻辑,甚至还需要一个缓存服务器来维护,这使得一次请求的链路变长,出现问题的概率也比较大
那干脆让客户端来维护自己的用户信息就好了,这样大量的用户信息就分散到各个用户的设备上,服务器的压力就会减少很多
客户维护鉴权信息的机制类似于http协议也是无状态的,这也使得整个服务拓展性大大提升

用token代替session

  • 用户第一次登录,服务器验证用户,通过后生成一个token
  • 在第一次返回时将token返回给客户端,客户端存储下来,下次请求时携带上该token
  • 之后只要验证token是否有效即可
  • 为了避免篡改,可以在token中使用加密算法生成签名,加入token(私钥保存在服务器上,因此签名无法被破解)
    请添加图片描述

JWT(JSON Web Token)token生成标准

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。因为携带了数字签名,因此该信息可以被验证和信任的
JWT由三部分数据组成,三部分由 点(.) 进行分割

  • Header(头部)
  • Payload(负载)
  • Signature(签名)
    Header.Payload.Signature

Header

Header 部分是一个 JSON 对象,描述 JWT 的元数据,例如:

{
  "alg": "HS256",
  "typ": "JWT"
}

alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT
最后,将上面的 JSON 对象使用 Base64URL 算法转成字符串

Payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 规定了7个官方字段,可以从中选择使用

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

当然也可以自定义字段,不过由于这部分数据是明文传送,所以不要在payload字段上存放任何私密信息

Signature

Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(base64UrlEncode(header)+"."+base64UrlEncode(payload),secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户
因为使用了签名,因此即使泄露,也无法被篡改

局限

  • 服务器不保存Session信息,在没有特殊逻辑的情况下,无法在使用过程中废止某个 token,也不能更改 token 的权限,一旦 JWT 签发了,在到期之前就会始终有效
  • Token本身就是认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证
  • 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输

三、token授权之OAuth2.0

严格来讲,OAuth2.0不算一种授权方式,而是一个安全的授权认证的框架。为系统中不同角色、用户、服务前端应用(比如API),以及客户端(比如网站或移动App)提供了一套相互认证的框架
所以一般而言,在OAuth2.0中存在三种角色:服务提供方,用户,第三方服务 ;用户授权第三方服务使用自身的某些权限,去访问服务提供方的资源(比如用qq账户登录微博)

OAuth2.0分为两步,获取Authorization以及获取Token

获取Authorization

  • 用户在授权界面,选择需要授权的权限点,登录确定授权
  • 授权后回调第三方服务的回调地址
  • 通过回调地址,发送Authorization(可以看做是验证码,有效期不长)给第三方服务

获取Token并维护Token有效性

  • 通过上面拿到的Authorization调用服务提供方的接口获取token
  • token由access token与refresh token两个token组成,access token有效性比refresh token短
  • 访问服务提供方接口需要使用access token,而当access token快过期的时候就需要用refresh token请求token刷新接口,获取新的token
    请添加图片描述
    OAuth 2.0 rfc文档:https://www.rfc-editor.org/rfc/rfc6749

OAuth2.0提供了4种认证方式,上面是最为复杂的一种,授权码模式,其余3种授权方式如下

简化模式

不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证
请添加图片描述

(A)客户端将用户导向认证服务器。
(B)用户决定是否给于客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
(F)浏览器执行上一步获得的脚本,提取出令牌。
(G)浏览器将令牌发给客户端。

密码模式

用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式
请添加图片描述

(A)用户向客户端提供用户名和密码。
(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。
(C)认证服务器确认无误后,向客户端提供访问令牌。

客户端模式

指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证
请添加图片描述

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。
(B)认证服务器确认无误后,向客户端提供访问令牌。

优点

  • 更安全,客户端不接触用户密码
  • 资源服务器可以和授权服务器解耦
  • 适用多种客户端架构场景

缺点

  • 协议框架太宽泛,每个服务又都自己的实现,兼容性和互操作性比较差
  • 客户端需要维护token有效性,维护定时刷新token任务

四、ak/sk认证鉴权

  • 服务提供方需要给每个用户分配一对 Access Key Id(AK) / Secret Access Key(SK)
  • 双方约定同样的加密算法,利用 时间戳,sk,nonce(一个随机值,为了避免请求重放),参数等信息作为计算因子,算出sign签名
  • 用户在调用api时,需要提供自己的身份认证(AK),时间戳、nonce以及加密好的sign签名
  • 服务提供方验证签名是否过期,验证nonce是否唯一,并利用同样的算法算出sign,与传入sign进行比对,如果一致则通过认证
    请添加图片描述

优点

  • 安全性高,在秘钥与算法不泄露情况下,签名无法破解
  • 有过期时间,可以避免签名长期有效的情况
  • 有防止重放机制,即使签名被捕获,也无法再次利用相同的签名进行请求

缺点

  • 对于服务调用方与被调用方都需要一定的编码要求
  • 每次请求都需要重新计算签名,不那么轻量
  • 服务提供方需要维护ak/sk关系,并且需要维护nonce是否唯一逻辑

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

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

相关文章

记一次linux服务器磁盘空间占满的问题排查

问题:服务器安装后两天,发现磁盘空间使用满了【date: write error: No space left on device】问题排查:1、使用df -hl命令查看2、使用du -hl --max-depth1,从根目录开始查起,最后发现,磁盘的空间全部被/va…

自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分

我的学习心得,我认为能不能自学成功的要素有两点。 第一点就是自身的问题,虽然想要转行学习Java的人很多,但是非常强烈的想要转行学好的人是小部分。而大部分人只是抱着试试的心态来学习Java,这是完全不可能的。所以能不能学成Jav…

【Linux】项目的自动化构建-make/makefile

💣1.背景会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译&#xff…

Java List系列(ArrayList、LinekdList 以及遍历中删除重复元素时发生的异常和解决办法)

目录List集合系列List系列集合特点List集合特有方法List集合的遍历方式ArrayList集合的底层原理分析源码LinkedList集合的底层原理集合的并发修改异常问题(删除重复元素时)List集合系列 List系列集合特点 ArrayList、LinekdList :有序&#…

HNU工训中心:电子开关与信号隔离

工训中心的牛马实验 1.实验目的: 1) 认识三极管和MOS管构成三端电子开关电路; 认识信号隔离的继电器和光电隔离方式。 2) 认识施密特触发器,掌握一种波形变换方法。 3) 实现一种脉冲波形发生器。 2.实验资源 HBE硬件基础电路实验箱、示波…

2.FFmpeg5.1下载和使用

1.FFmpeg库下载 进入http://ffmpeg.org/download.html 官网,如下图所示: 由于我们初期只在windows上

北京筑龙吴英礼:ChatGPT对采购与招标数字化的影响

2月25日下午,平台经济学沙龙(第八期)在清华大学互联网产业研究院成功举办。本期沙龙以“ChatGPT对招标采购的影响”为主题,由清华大学互联网产业研究院平台经济课题组组长、中国招标投标公共服务平台原总经理、首席经济学家平庆忠…

Leetcode19. 删除链表的倒数第n个结点

一、题目描述: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2输出:[1,2,3,5] 示例 2: 输入:head [1], n 1输出&#x…

Android开发八股文,Android也有自己的八股文了

前言别的行业都有自己的八股文,凭什么Android没有。2023春招即将来临,很多同学会问 Android开发的面试题有必要背吗?我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。国内…

SSL/TLS协议信息泄露漏洞(CVE-2016-2183)调查解决

目录结构前言测试回馈漏洞介绍漏洞解决参考文献前言 产品测试阶段出现“SSL/TLS协议信息泄露漏洞(CVE-2016-2183)”,解决过程记录如下 测试回馈 建议:避免使用IDEA、DES和3DES算法 1、OpenSSL Security Advisory [22 Sep 2016] …

P02 滴水逆向1月4号公开课

公开课进制转换汇编如何工作的逻辑运算二进制逻辑运算|| 运算 和 | 运算&& 运算 和 & 运算^(异或) 运算! (非)运算左移二进制逻辑运算应用加法运算运算与电脑硬件进行加密寄存器内存寻址范围使用内存寻址公式堆栈变形的艺术进制转换 二进制十六进制如何转换的 汇…

k8s学习之路 | Day17 k8s 工作负载

文章目录工作负载的定义工作负载资源分类工作负载的定义 官方参考链接:https://kubernetes.io/docs/concepts/workloads/ A workload is an application running on Kubernetes. Whether your workload is a single component or several that work together, on K…

已解决ERROR: Failed building wheel for opencv-python-headless

已解决ERROR: Failed building wheel for opencv-python-headless Failed to build opencv-python-headless ERROR: Could not build wheels for opencv-python-headless, which is required to install pyproject.toml-based projects报错信息亲测有效 文章目录报错问题报错翻…

多任务学习概述

文章目录前言1 文章信息2 背景、目的、结论2.1 背景2.1.1 多任务的类型分类2.1.1.1 相关任务的分类2.1.1.2 将输入变输出的逆多任务学习2.1.1.3 对抗性多任务学习2.1.1.4 辅助任务提供注意力特征的多任务学习2.1.1.5 附加预测性辅助任务的多任务学习3 内容与讨论3.1 多任务学习…

HTML+ CSS 笔记

CSS1. 外边距合并 margin2. 浮动和清除浮动3. CSS 属性书写顺序(重点)4. 页面布局分析5. 定位定位模式子绝父相:z-index定位的拓展6. 元素的显示与隐藏7. 精灵图 sprites8. 字体图标 iconfont9. 居中10. 文字溢出处理情况11.HTML5 和CSS3 新增标签12.品优购1. 项目规…

多数据库管理工具哪家强?ChatGPT点评,第一位并不是Navicat

SQL逐渐成为职场必备的编程语言,相信大家都不陌生。SQL是一种结构化查询语言,是用于数据库之间通信的编程语言。每个数据库都有着自己独特的访问规则,但大体上是遵循SQL标准。 因此,辗转于不同的数据库之间,开发者或D…

Codeforces Round #852 (Div. 2) D. Moscow Gorillas

传送门 题意: 给你两个长度为n的排列p,q,同时定义mex表示为在mex中,缺少的最小正整数:如 mex[1,3]2,mex[1,2,3]4。 问你有多少个l,r使mex([])mex([])。 思路 : 可以从mex1,2,3,4,..n…

Word 行中公式与文字对不齐的解决方案

Word 行中公式与文字对不齐的解决方案问题-公式与文字不对齐解决方案简述版(亲测)解决方案详细版(亲测)参考方案问题-公式与文字不对齐 由于复制或其它误操作,可能会出现Word一行中公式与文字并不对齐的问题,有的公式会偏上或偏下,如下图所示…

【Linux内核】内核编程概述

1.GNU GNU计划和自由软件基金会(FSF)是由Richard M.Stallman于1984年创办的,GNU是“GNU’s Not UNIX”的缩写。到20世纪90年代初,GNU项目已经开发出许多高质量的免费软件,其中包括emacs编辑系统、bash shell程序、gcc…

PIGOSS BSM 信创运维之国产数据库监控

随着信创的推进,为国产数据库厂商提供了发展沃土,国产厂商扮演者越来越重要的角色。国产数据库以达梦、人大金仓、南大通用、高斯数据库GaussDB、万里开源为代表,而新兴厂商则利用分布式进行换道超车,以PingCAP、巨杉数据库、星环…