微服务网关的认证管理;原理与实践

API安全认证是网关的最重要能力

API 网关为了保护对外提供的API,避免诸如恶意访问、未授权访问、应用漏洞及黑客攻击等导致的数据和资产损失,采用API网关的认证机制显得十分必要。

这种认证机制通过基于token的身份验证来实现,它允许应用程序在不保留用户认证信息或会话信息的情况下识别请求者的身份,从而判断所请求的资源是否可以返回给请求者。

API网关常见认证方式说明与解析

API密钥:适用于需要简单快速实现访问控制的场景。优势是易于实施和管理,劣势是安全性较低,容易被滥用或泄露。

OAuth 2.0:适合需要第三方授权访问的应用场景。优点在于提供了灵活的安全机制和良好的用户体验,缺点是配置相对复杂,学习成本较高。

JWT(JSON Web Token):适用于分布式系统中跨域认证。其主要优势为减轻服务器负担、提高响应速度;但令牌一旦签发,在过期前无法撤销成为其一大缺点。

Basic Auth:最简单的HTTP身份验证方法之一,适合于非敏感信息传输。它实现起来非常简单快捷,但由于以明文形式传输用户名密码,因此安全性较差。

OpenID Connect:基于OAuth 2.0协议构建的身份验证层,适合单点登录(SSO)。能够简化用户登录流程并增强安全性,不过对于小型项目来说可能显得过于重量级。

这里面最常用的还是JWT和OAuth ,后面以JWT为例,说明具体的网关认证流程与原理

JWT 认证方式来说明网关认证的流程与原理

JWT (Json Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。它通常用于身份验证和信息交换。以下是以JWT认证为例的网关认证基本原理及详细步骤。

1. 客户端向 API 网关发起认证请求
  • 客户端API 网关 发起一个认证请求,这个请求中一般会携带终端用户的用户名和密码。
  • 请求示例:
curl -X POST http://api.example.com/auth -d 'username=johndoe&password=secret'
2. 网关将请求转发给后端服务
  • 网关收到请求后,将其直接转发给后端服务进行用户身份验证。
3. 后端服务验证用户身份并生成 JWT
  • 后端服务读取请求中的验证信息(如用户名、密码),通过数据库或其他方式验证这些信息是否正确。
  • 如果验证通过,后端服务使用私钥生成一个标准的 JWT,并返回给网关
  • 生成 JWT 的示例代码:
JwtClaims claims = new JwtClaims();
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
claims.setExpirationTime(NumericDate.now().addSeconds(3600)); // 设置过期时间为1小时
claims.setSubject("johndoe");
JsonWebSignature jws = new JsonWebSignature();
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);
jws.setPayload(claims.toJson());
PrivateKey privateKey = ...; // 使用从 JWK 中获取的私钥
jws.setKey(privateKey);
String jwt = jws.getCompactSerialization();
4. 网关将 JWT 返回给客户端
  • 网关将携带 JWT 的响应返回给客户端,客户端需要将这个 JWT 缓存到本地(例如存储在浏览器的 localStorage 或 sessionStorage 中)。
  • 响应示例:
{"token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJKb2huIERvZSIsImlhdCI6MTYyOTIzMjEwOSwiZXhwIjoxNjI5MjMyNzA5fQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
}
5. 客户端向 API 罗盘发送业务请求,请求中携带 JWT
  • 客户端需要访问受保护的资源时,会在请求头中添加 JWT。
  • 请求示例:
curl -H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJKb2huIERvZSIsImlhdCI6MTYyOTIzMjEwOSwiZXhwIjoxNjI5MjMyNzA5fQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" http://api.example.com/protected-resource
6. 网关验证 JWT 并转发请求
  • 网关接收到请求后,使用配置的公钥对请求中的 JWT 进行验证。
  • 验证过程包括检查 JWT 的签名、过期时间等字段。
  • 如果验证通过,网关将请求透传给后端服务;如果验证失败,则返回相应的错误码(如 401 Unauthorized)。
7. 后端服务处理业务请求并返回响应
  • 后端服务处理完业务逻辑后,返回响应给网关
8. 网关将业务响应返回给客户端
  • 网关后端服务的响应返回给客户端

通过上述步骤,网关利用 JWT 实现了无状态的身份验证机制,确保只有经过认证的用户才能访问受保护的资源。这种机制不仅简化了身份验证的过程,还提高了系统的可扩展性和安全性。

下面我们用Higress来具体看看,怎么通过简单配置的方式实现JWT 认证。

Higress 简单介绍

Higress 是一个基于 Envoy 和 Istio 构建的云原生 API 网关,实现了流量网关、微服务网关和安全网关三合一的高集成能力。它能够支持 Dubbo、Nacos、Sentinel 等微服务技术栈,并通过配置即可快速方便地支持多种安全认证方式,极大地简化了部署和运维成本。

Higress JWT认证配置详解

要基于Higress实现JWT认证,我们需要通过详细的配置来确保认证机制能够正确地工作。这包括全局配置、消费者配置以及对特定路由或域名开启JWT认证的具体步骤。以下将按照配置字段说明和示例配置来进行详细介绍。

全局配置

首先,在全局配置中,需要定义consumersglobal_auth两个主要参数。

  • consumers:这是一个数组,用于定义服务调用者的信息,每一个消费者都需要配置其名称(name)、JSON Web Key Set(jwks)及签发者(issuer)。此外,还可以根据需求设置其他如claims_to_headersfrom_headers等。
  • global_auth:该布尔值决定了JWT认证是否全局生效。若为true,则所有请求均需通过认证;若为false,只有明确设置了allow列表的路由或域名才需要认证。

配置示例

consumers:- name: consumer1issuer: abcdjwks: |{"keys": [{"kty": "oct","kid": "123","k": "hM0k3AbXBPpKOGg__Ql2Obcq7s60myWDpbHXzgKUQdYo7YCRp0gUqkCnbGSvZ2rGEl4YFkKqIqW7mTHdj-bcqXpNr-NOznEyMpVPOIlqG_NWVC3dydBgcsIZIdD-MR2AQceEaxriPA_VmiUCwfwL2Bhs6_i7eolXoY11EapLQtutz0BV6ZxQQ4dYUmct--7PLNb4BWJyQeWu0QfbIthnvhYllyl2dgeLTEJT58wzFz5HeNMNz8ohY5K0XaKAe5cepryqoXLhA-V-O1OjSG8lCNdKS09OY6O0fkyweKEtuDfien5tHHSsHXoAxYEHPFcSRL4bFPLZ0orTt1_4zpyfew","alg": "HS256"}]}- name: consumer2issuer: abcjwks: |{"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
域名和路由级配置

对于特定的路由或域名,可以通过allow字段指定允许访问的consumer名单。如果全局认证被关闭(即global_auth: false),那么仅这些特定路径上的请求才会进行认证检查。

配置示例

# 对 route-a 和 route-b 这两个路由做如下配置:
route-a:allow:- consumer1
route-b:allow:- consumer1# 对 *.example.com 和 test.com 在这两个域名做如下配置:
*.example.com:allow:- consumer2
test.com:allow:- consumer2
注意事项
  • 只有当from_headersfrom_paramsfrom_cookies均未配置时,系统会使用默认值从HTTP头部获取JWT。
  • 认证成功后,请求的header中会被添加一个X-Mse-Consumer字段,标识调用方的名称。
  • 如果请求中未提供有效的JWT或者提供的JWT不满足权限要求,则分别返回401或403状态码。

通过上述配置,你可以在Higress上启用JWT认证,并根据实际需要灵活调整具体的认证规则与范围。

Higress的简易安装指南

根据我了解的信息中提供的信息,可以使用Docker来快速地在本地单机上部署和运行Higress。这种部署方式非常适合个人开发者进行学习或者搭建简易站点使用。

前提条件
确保您的机器已经安装了Docker。如果尚未安装,请访问Docker官方文档按照指引完成安装过程。

部署步骤

  1. 创建一个用于存放Higress相关文件的工作目录。
mkdir higress
  1. 启动Higress容器。此命令会启动一个包含Higress及其所有必要组件的容器,并将主机上的8001、8080以及8443端口映射到容器内的相应端口。
docker run -d --rm --name higress-ai -v ./higress:/data \-p 8001:8001 -p 8080:8080 -p 8443:8443  \higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest

这里指定使用的镜像是higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest,它包含了运行Higress所需的所有组件。同时通过-v选项将当前目录下的higress子目录挂载到容器内部,以便于持久化配置数据等信息。

监听端口说明

  • 8001 端口:Higress UI 控制台入口。
  • 8080 端口:网关 HTTP 协议入口。
  • 8443 端口:网关 HTTPS 协议入口。

完成上述步骤后,您就成功地在本地环境中部署了一个Higress实例。接下来可以通过浏览器访问http://127.0.0.1:8001打开Higress控制台来进行进一步的配置工作。

注意,在首次访问控制台时需要先初始化管理员账号,之后便可以登录并开始配置服务来源及路由规则等。

以上就是基于Docker实现Higress单机版的完整安装流程。

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

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

相关文章

C++学习笔记2----模板类、继承、struct在class内定义相关问题记录

背景:写的算法合并到项目组代码,编译发现一些以前没积累过的错误,这里记录下,也供大家参考。 一、问题1 // 每个类都有单独的.h .cpp class A; class B : public A {// ... }; class C : public A {// ... };若在B.h中引用了一个…

STM32 + CubeMX + 硬件SPI + W5500 +TcpClient

这篇文章记录一下STM32W5500TCP_Client的调试过程,实现TCP客户端数据的接收与发送。 目录 一、W5500模块介绍二、Stm32CubeMx配置三、Keil代码编写1、添加W5500驱动代码到工程(添加方法不赘述,驱动代码可以在官网找)2、在工程中增…

微信小程序中,点击视频,没有跳转播放,可能是因为没有在app.json中正确注册视频播放页面的路径

const customMethodMap {handlePreview(e) {const { item: { url } } e?.currentTarget?.datasetconsole.log(Clicked item URL:, url); // 输出URLconst type url.split(.)[url.split(.)?.length - 1]console.log(File type:, type); // 输出文件类型console.log(isDoc(…

软件体系结构

第一章 构件 具有某种功能的 可复用的软件结构单元,为组装服务,可部署,具有规范的接口规约和显式的语境依赖 构件模型 构件模型是对构件本质特征的抽象描述,可以把它想象成一个类的组合,它封装了多个类,并具有一个或多个服务而提供了简单…

什么是垃圾回收(Garbage Collection)?

垃圾回收(Garbage Collection)是一种自动管理内存的机制,在编程语言中,它负责自动检测和释放不再被程序使用的内存,以避免内存泄漏和内存碎片的问题。 以下是一段示例代码: public class Example {public…

Spark 的Standalone集群环境安装与测试

目录 一、Standalone 集群环境安装 (一)理解 Standalone 集群架构 (二)Standalone 集群部署 二、打开监控界面 (一)master监控界面 (二)日志服务监控界面 三、集群的测试 &a…

react的antd-mobile使用Steps显示物流

antd-mobile的图标,是需要安装依赖的 step如果只有一个步骤是不会展示的,代码里面的标题那块可以看出来 尝试了很多遍测试发现一直不显示,查询后发现是这个组件的本身设置的原因 那么就算你只展示一个那么也要写两个step,第二个…

基于鸟类AI识别的果园智能物联网解决方案

1. 项目背景 我国拥有广阔的果园种植面积,但每年因鸟类造成的损失高达数亿元。传统的防鸟害措施,如建立防护网和使用物理化学方法,效果并不理想,且成本较高。为了解决这一问题,深圳快瞳科技有限公司的提出基于鸟类AI识…

uniapp 使用vue/pwa

vue add vue/pwa src下创建service-worker.js /* eslint-disable no-undef*/ importScripts(https://storage.googleapis.com/workbox-cdn/releases/5.1.2/workbox-sw.js) if (workbox) {console.log(Yay! Workbox is loaded 🎉) } else {console.log(Boo! Workbo…

Java 实现接口幂等的九种方法:确保系统稳定性与数据一致性

摘要: 在分布式系统中,接口的幂等性至关重要,它能确保重复请求不会导致意外的副作用。本文深入探讨了 Java 实现接口幂等的九种方法,包括数据库唯一约束、状态机、分布式锁等,并通过详细的代码示例和实际应用场景&…

让Erupt框架支持.vue文件做自定义页面模版

Erupt是什么? Erupt 是一个低代码 全栈类 框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。 零前端代码、零 CURD、自动建表,仅需 一个类文件 简洁的注解配置,快速开发企业级 Admin 管理后台。 提…

如何优雅处理异常?处理异常的原则

前言 在我们日常工作中,经常会遇到一些异常,比如:NullPointerException、NumberFormatException、ClassCastException等等。 那么问题来了,我们该如何处理异常,让代码变得更优雅呢? 1 不要忽略异常 不知…

OCR与PaddleOCR介绍

OCR技术与PaddleOCR的介绍 在数字化时代,光学字符识别(OCR,Optical Character Recognition)技术变得越来越重要。OCR技术可以将图像中的文本转换为可编辑和可搜索的文本格式,广泛应用于文档数字化、自动化数据输入、车…

DBAPI连接阿里云 maxcompute 报错

使用正确的驱动包 访问以下链接寻找驱动包 https://github.com/aliyun/aliyun-odps-jdbc/releases/tag/v3.4.3 注意要使用odps-jdbc-3.4.3-jar-with-dependencies.jar ,这个是完整的jar包 不要使用odps-jdbc-3.4.3.jar,这个不是完整的,它还…

2024最新Python安装教程+Pycharm安装教程【附安装包】

Python安装 1.首先下载好Python安装包 获取方式:点击这里(扫描神秘②薇码免下载)完全免费!!! 2.打开安装包,先勾选最下面两个选项,再选择第二个自定义安装 3.这里默认全选&#xff…

Fatal error: Uncaught Error: Call to undefined function mysql_connect() 解决办法详细

情况一 Fatal error: Uncaught Error: Call to undefined function mysql_connect() in /www/wwwroot/www.ygwzjs.cn/dg_upload/class/db_sql.php:72 Stack trace: #0 /www/wwwroot/www.ygwzjs.cn/dg_upload/class/combakfun.php(192): do_dbconnect_common(localhost, , guiz…

【数据库】elasticsearch

1、架构 es会为每个索引创建一定数量的主分片和副本分片。 分片(Shard): 将索引数据分割成多个部分,每个部分都是一个独立的索引。 主要目的是实现数据的分布式存储和并行处理,从而提高系统的扩展性和性能。 在创建索…

Oracle 第19章:高级查询技术

在Oracle数据库中,高级查询技术是数据库管理员和开发人员必须掌握的重要技能。这些技术能够帮助优化查询性能,简化复杂的查询逻辑,并提高数据处理的效率。本章将重点讨论两个关键概念:子查询和连接与并集操作。 子查询 定义: 子…

JAVA基础:数组 (习题笔记)

一,编码题 1,数组查找操作:定义一个长度为10 的一维字符串数组,在每一个元素存放一个单词;然后运行时从命令行输入一个单词,程序判断数组是否包含有这个单词,包含这个单词就打印出“Yes”&…

pytoch单卡改多卡ddp训练

参考:https://blog.csdn.net/weixin_44966641/article/details/121872773 单卡代码,启动代码 python train.py: import torch import torch.nn as nn from torch.optim import SGD from torch.autograd import Variable from torch.utils.da…