API网关 - JWT认证 ; 原理概述与具体实践样例

news2024/11/5 19:52:58

API网关主要提供的能力,就是协议转换,安全,限流等能力。

本文主要是分享 如何基于API网关实现 JWT 认证 。  

包含了JWT认证的流程,原理,与具体的配置样例

API网关认证的重要性

在现代Web应用和微服务架构中,API网关作为系统对外提供服务的入口点,其安全性和可靠性显得尤为重要。为了保护您对外提供的API,防止恶意访问、未授权访问、应用漏洞以及黑客攻击等潜在威胁,从而避免由此导致的数据丢失或资产损失,实施有效的认证机制是至关重要的。

2. 流程描述

通过引入JWT(Json Web Token)这样的结构化令牌来实现基于token的身份验证,具体流程如下:

  1. 客户端首先向API网关发起认证请求,通常这一步会包含用户的基本凭证,如用户名与密码。
  1. API网关将该请求转发至后端的服务进行处理。
  1. 后端服务完成对提交凭证的有效性检查后,如果验证成功,则利用预设的私钥生成一个带有时间限制及其他必要声明的新JWT。
  1. 这个新生成的JWT被封装进响应并由API网关返回给客户端。
  1. 客户端保存收到的JWT,并在未来向API发出的每一个请求中都携带这个token。
  1. 当API网关接收到含有有效JWT的请求时,它使用之前配置好的公钥来解码和验证这个token的真实性及有效性。只有当这些步骤全部通过了才会允许请求继续传递到实际的目标服务。
  1. 目标服务执行相应的逻辑操作,并最终通过API网关把结果回传给原始调用方。

采用上述方法不仅能够确保只有经过身份验证的用户才能访问敏感数据和服务,同时也简化了跨多个服务间共享身份信息的过程。此外,由于每个JWT都是独立的且包含了所有必要的认证细节,因此即使在网络传输过程中被捕获也难以被篡改或重复使用,进一步增强了系统的安全性。

API网关常用认证方式解析

API密钥认证:适合轻量级安全需求场景,如内部系统间通信。优势在于简单易用、实现快速;劣势是安全性较低,一旦泄露可能导致服务滥用。

OAuth 2.0:适用于需要授权第三方应用访问资源的场景。优点为灵活性高,支持多种授权模式;缺点是复杂度较高,实施成本大。

JWT(JSON Web Tokens):适合分布式微服务架构下的身份验证。其优势是无状态、可跨域使用;但令牌体积较大且一旦签发后无法撤销为其不足之处。

Basic Auth:用于对安全性要求不高的场合。易于实现是其主要优点;然而,它以明文形式传输用户名密码,存在较大安全隐患。

HMAC签名:常用于确保消息完整性和来源真实性。能够有效防止中间人攻击,但在大规模部署时可能因计算签名消耗较多资源而显得效率低下。

通过常见认证方式解析网关认证的核心机制

以最常用的认证方式为例,介绍网关认证的基本原理

在讨论基于JWT的认证机制时,首先需要理解这种令牌(token)是如何帮助实现安全且高效的身份验证过程。根据提供的参考资料,下面将详细介绍使用JWT进行API网关认证的基本流程。整个过程涉及客户端、API网关以及后端服务之间的交互。

  1. 客户端发起认证请求:当用户尝试访问受保护资源时,第一步是通过用户名和密码或其他形式的身份凭据向API网关发送一个认证请求。
  1. 网关转发请求至后端服务:收到认证请求后,API网关不会自行处理这个请求而是将其直接转发给负责验证用户身份的后端服务或系统。
  1. 后端服务验证用户信息并生成Token:后端服务接收到转发过来的认证请求后,会校验其中包含的用户凭证。如果这些凭证有效,则该服务利用事先配置好的私钥来生成一个JWT。这个过程中可能还包括设置一些关于此令牌的有效期限等属性。
  1. 返回带有Token的响应:一旦成功创建了JWT,后端服务将其作为响应的一部分发回给API网关。随后,API网关再将此包含JWT的响应返回给最初的请求者——客户端。此时,客户端应当保存好这个令牌以便后续使用。
  1. 客户端携带Token发起业务请求:每当客户端想要访问任何需要权限控制的服务时,都必须在其HTTP请求中附加之前获得的JWT。这通常可以通过在请求头中加入Authorization: Bearer <token>的方式完成。
  1. 网关验证Token有效性:对于每个到达的请求,API网关都会检查是否存在有效的JWT,并且尝试使用存储于其配置中的公钥对该JWT进行解码及验证。这里主要检查的是签名是否正确、令牌是否过期等因素。
  1. 验证通过后转发请求:只有当JWT被确认为合法且未超时的情况下,API网关才会继续处理该请求并将之传递给相应的后端服务。反之,若发现令牌无效或已失效,则应拒绝此次访问并立即终止流程。
  1. 后端执行逻辑并回复结果:最后一步是由实际提供服务的应用程序来处理经过认证后的请求,完成后它会将处理结果经由API网关反向传回到原始客户端那里。

以上步骤概述了一个完整的基于JWT的API网关认证流程。需要注意的是,在实际部署时还需要考虑到诸如密钥管理、异常处理等额外的安全措施以确保整个系统的稳定性和安全性。

Higress概述

Higress是一个基于Envoy和Istio构建的云原生API网关,它集成了流量网关、微服务网关以及安全网关的功能,深度支持Dubbo、Nacos等微服务技术栈,能够显著降低用户的部署与运维成本。特别值得一提的是,Higress仅通过简单的配置就可以支持大部分的安全认证方式,包括但不限于基本认证、JWT、OAuth2.0等,这极大地提高了系统安全性的同时也保证了操作的便捷性和灵活性。

JWT认证配置的详尽指南

JWT认证的详细配置方式

基于Higress实现JWT认证需要进行一系列详细的配置步骤。以下将详细介绍如何通过Higress的配置来实现JWT认证,包括全局配置、消费者配置以及路由级配置的具体流程和代码示例。

1. 全局配置

首先,你需要在全局配置中定义jwt-auth插件的基本设置。这些设置包括是否启用全局认证机制(global_auth),以及定义服务调用者(consumers)的相关信息。

配置示例:

# 全局配置
consumers:
- name: consumer1
  issuer: abcd
  jwks: |
    {
      "keys": [
        {
          "kty": "oct",
          "kid": "123",
          "k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew",
          "alg": "HS256"
        }
      ]
    }

- name: consumer2
  issuer: abc
  jwks: |
    {
      "keys": [
        {
          "kty": "RSA",
          "e": "AQAB",
          "use": "sig",
          "kid": "123",
          "alg": "RS256",
          "n": "i0B67f1jggT9QJlZ_8QL9QQ56LfurrqDhpuu8BxtVcfxrYmaXaCtqTn7OfCuca7cGHdrJIjq99rz890NmYFZuvhaZ-LMt2iyiSb9LZJAeJmHf7ecguXS_-4x3hvbsrgUDi9tlg7xxbqGYcrco3anmalAFxsbswtu2PAXLtTnUo6aYwZsWA6ksq4FL3-anPNL5oZUgIp3HGyhhLTLdlQcC83jzxbguOim-0OEz-N4fniTYRivK7MlibHKrJfO3xa_6whBS07HW4Ydc37ZN3Rx9Ov3ZyV0idFblU519nUdqp_inXj1eEpynlxH60Ys_aTU2POGZh_25KXGdF_ZC_MSRw"
        }
      ]
    }

global_auth: false
  • consumers: 定义了多个服务调用者,每个调用者都需要指定nameissuerjwks
  • jwks: 是一个JSON Web Key Set,用于验证JWT签名。
  • global_auth: 如果设置为true,则全局生效认证机制;如果设置为false,则只对做了配置的域名和路由生效认证机制。
2. 路由级配置

接下来,你需要为特定的路由或域名配置允许访问的消费者列表。

配置示例:

# 对 route-a 和 route-b 这两个路由做如下配置:
allow:
- consumer1

# 对 *.example.com 和 test.com 在这两个域名做如下配置:
allow:
- consumer2
  • allow: 指定该匹配条件下允许访问的调用者列表。
  • 当请求匹配到这些路由或域名时,只有在allow列表中的消费者才能访问。
3. 配置字段详解

为了更好地理解上述配置,以下是各个配置字段的详细说明:

  • consumers
    • name: 消费者的名称。
    • issuer: JWT的签发者,需要和payload中的iss字段保持一致。
    • jwks: JSON Web Key Set,用于验证JWT签名。
    • claims_to_headers: 抽取JWT的payload中指定字段,设置到指定的请求头中转发给后端。
    • from_headers: 从指定的请求头中抽取JWT。
    • from_params: 从指定的URL参数中抽取JWT。
    • from_cookies: 从指定的cookie中抽取JWT。
    • clock_skew_seconds: 校验JWT的exp和iat字段时允许的时钟偏移量,单位为秒。
    • keep_token: 转发给后端时是否保留JWT。
  • global_auth: 是否启用全局认证机制。
  • allow: 对特定路由或域名允许访问的消费者列表。
4. 常见错误码说明

在配置过程中,可能会遇到一些常见的错误码,这些错误码及其原因如下:

HTTP 状态码

出错信息

原因说明

401

Jwt missing

请求头未提供JWT

401

Jwt expired

JWT已经过期

401

Jwt verification fails

JWT payload校验失败,如iss不匹配

403

Access Denied

无权限访问当前路由

通过以上详细的配置步骤,你可以在Higress中成功实现JWT认证。确保所有配置项都正确填写,并且根据实际需求调整相应的设置。

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

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

相关文章

Excel:vba实现批量插入图片

实现的效果&#xff1a; 实现的代码&#xff1a; Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Pic As ObjectDim Name As String 防止表格里面有脏数据Cells.Clear 遍历工作表中的每个图…

什么是 OpenTelemetry?

OpenTelemetry 定义 OpenTelemetry (OTel) 是一个开源可观测性框架&#xff0c;允许开发团队以单一、统一的格式生成、处理和传输遥测数据&#xff08;telemetry data&#xff09;。它由云原生计算基金会 (CNCF) 开发&#xff0c;旨在提供标准化协议和工具&#xff0c;用于收集…

电商美工必备神器:千鹿 AI 轻松解决场景图主图尺寸问题

前言 在电商领域&#xff0c;美工在做详情页设计时&#xff0c;常常会为图片尺寸问题而苦恼。而 AI 扩图在此刻就成为了美工们的得力助手。其中&#xff0c;场景图主图太小是一个让人颇为头疼的难题。千鹿 AI 作为一款强大的工具&#xff0c;能够一键将图片改成指定尺寸&#…

关于 PDF 抽取的吐槽

今天一下午写了8&#xff0c;9个 PDF 抽取的脚本。最后又回归最开始简单的模式了&#xff0c;要疯了&#xff0c;谁懂啊。 我是下午的工作是这样的(我是这么疯的) 最开始使用最简单的策略&#xff0c;先使用 PyPDF2.PdfReader(file) 读取文件&#xff0c;然后在每一页使用 pag…

无人机避障——(局部规划方法)DWA(动态窗口法)

传统的DWA算法更加倾向于车辆等差速无人车&#xff0c;旋翼无人机是全速的&#xff0c;全向的。 全局路径是通过A*算法生成的 局部路径规划效果&#xff1a; DWA算法效果&#xff1a; 过程图&#xff1a; 完整过程&#xff1a; PID算法效果&#xff1a; 过程图&#xff1a…

知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)

0x01 产品简介 知识吾爱纯净版小程序系统是一款基于微信小程序平台开发的知识付费应用,旨在帮助用户快速建立自己的知识付费平台,实现支付变现和流量主收益。它提供了简洁明了的用户界面和良好的用户体验,同时注重用户隐私保护,确保用户信息的安全存储和传输。 0x02 漏洞…

基于web的便捷饭店点餐小程序的设计与实现(lw+演示+源码+运行)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

全面解析:深度学习技术及其应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 全面解析&#xff1a;深度学习技术及其应用 全面解析&#xff1a;深度学习技术及其应用 全面解析&#xff1a;深度学习技术及其应…

项目实战使用gitee

1.创建本地仓库 2.进行提交到本地仓库 创建仓库后在idea中会显示图标&#xff0c;点击绿色的√进行快速提交 3.绑定远程仓库 4.番外篇-创建gitee仓库 注意不要勾选其他

【鸿蒙新闻】10月29日警用鸿蒙开发者大会在北京胜利召开,开启智慧应用新时代!

10月29日&#xff0c;在公安部科技信息化局、公安部装备财务局指导下&#xff0c;由公安部第一研究所主办&#xff0c;鼎桥通信技术有限公司、OpenHarmony生态委员会及公共安全专委会协办的警用鸿蒙开发者大会在北京胜利召开。会议以“拥抱警鸿创新生态 开启智慧应用新时代”为…

Spring Boot 3.3 【九】Redis 的五种数据结构深入浅出(String List Set Hash Zset)

如果觉得本文能够帮到您&#xff0c;请关注&#x1f31f;、点赞&#x1f44d;、收藏&#x1f4da;&#xff0c;让这份美好延续下去&#xff01; 一、Redis 数据结构简介 在现代应用开发中&#xff0c;高效的数据存储和管理是构建强大系统的关键。Redis 作为一种高性能的内存数…

命令行参数、环境变量、地址空间

命令行参数&#xff1a; int main(int argc, char *argv[ ])&#xff0c;main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。 在linux中会把输入的字符串存到char *argv[ ]中&#xff0c;在数组的结尾为NULL。 命令行参数可以让同一个程序可以通过不同…

持续优化,构建更好地 auto git commit 体验

几个月前&#xff0c;受到一篇推文的启发 https://x.com/mtrainier2020/status/1802941902964277379 &#xff0c;我突然想到可以借助 git alias 添加一些小命令&#xff0c;加速我的 git workflow 流程&#xff0c;于是我花了两个小时的时间进行工程封装&#xff0c;并发布了 …

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

AIGC产品经理高频面试题❗️看完的都拿高薪了

&#x1f914;️如果你正在考虑找AI产品经理相关的工作, 建议好好准备这些面试问题, 如果想要更加详细的回答可以直接询问海螺AI哦! 谁用了不说一句: AI真的太适合准备面试啦(&#x1f640;尖叫抛开 之后会分享更多岗位的面试题目, 以及如何用AI准备面试的tips哦! 大模型&A…

【VS+QT】联合开发踩坑记录

最新更新日期&#xff1a;2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作&#xff0c;需要用到QT&#xff0c;所以选择了VS联合开发&#xff0c;方便调试。学习QT的过程中也踩了很多坑&#xff0c;在此记录一下&#xff0c;提供给各位参考。 1. 环境配…

Windows下安装Maven并配置环境

在Windows下安装Maven、修改阿里云仓库、修改本地仓库路径&#xff0c;并为IntelliJ IDEA配置Maven&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装Maven 下载Maven&#xff1a; 访问 Apache Maven官网&#xff0c;下载最新版本的Maven二进制包&#xff08;zip格式…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…