Kong Key 认证

认证是验证请求者是否有权限访问资源的过程。正如其名称所示,API网关认证用于验证数据在上游服务之间的流动。

Kong网关具有支持最常用的API网关认证方法的插件库。

常见的认证方法包括:

  • 密钥认证
  • 基本认证
  • OAuth 2.0认证
  • LDAP认证高级
  • OpenID Connect

认证的好处

通过Kong网关控制认证,除非客户端成功认证,否则请求不会到达上游服务。这意味着上游服务处理经过预授权的请求,使它们摆脱了认证成本,节省了计算时间和开发工作量。

Kong网关可以查看所有的认证尝试,这提供了构建监控和警报功能的能力,支持服务的可用性和合规性。

开启认证

下面的教程介绍了如何在Kong网关中的各个方面启用密钥认证插件。

API密钥认证是强制API认证的常用方法。在密钥认证中,Kong网关用于生成并将API密钥与消费者关联起来。这个密钥是客户端在进行后续请求时呈现的认证凭据。根据呈现的密钥的有效性,Kong网关批准或拒绝请求。此过程可以全局应用或适用于单个服务和路由。

先决条件

这一章节是"开始使用Kong"系列的一部分。为了获得最佳体验,建议您从头开始按照系列进行操作。

从介绍开始,获取Kong,其中包括工具先决条件和运行本地Kong网关的说明。

指南的第二步"服务和路由"包括安装一个用于本系列的模拟服务的说明。

如果您尚未完成这些步骤,请在继续之前完成它们。

设置消费者和密钥

在Kong网关中,密钥认证通过使用消费者对象来实现。密钥分配给消费者,客户端应用程序在其发出的请求中呈现密钥。

1. 创建一个消费者

为了完成本教程,创建一个新的消费者,用户名为luka:

Lua 复制代码
curl -i -X POST http://localhost:8001/consumers/ \
 --data username=luka

您将收到一个201响应,表示已创建消费者。

2. 为消费者分配一个密钥

一旦配置完成,调用Admin API为新消费者分配一个密钥。对于本教程,将密钥值设置为top-secret-key:

Lua 复制代码
curl -i -X POST http://localhost:8001/consumers/luka/key-auth \
 --data key=top-secret-key

您将收到一个201响应,表示已创建密钥。

在这个例子中,您明确将密钥内容设置为top-secret-key。如果您没有提供密钥字段,Kong网关将为您生成密钥值。

警告:为了完成本教程,我们已分配了一个示例密钥值。建议让API网关为您自动生成一个复杂的密钥。只在测试或迁移现有系统时指定密钥。

全局密钥认证

在全局安装插件意味着每个代理请求到Kong网关都受到密钥认证的保护。

1. 开启密钥认证

Key认证插件默认安装在Kong网关上,可以通过向Admin API的plugins对象发送POST请求来启用:

Lua 复制代码
curl -X POST http://localhost:8001/plugins/ \
   --data "name=key-auth"  \
   --data "config.key_names=apikey"

您将收到一个201响应,表示插件已安装。

上述请求中的key_names配置字段定义了插件用于在认证请求时读取密钥的字段名称。插件将在请求的头部、查询字符串参数和请求体中查找该字段。

2. 发送一个未经身份验证的请求

尝试在未提供密钥的情况下访问该服务:

Lua 复制代码
curl -i http://localhost:8000/mock/anything

由于您在全局启用了密钥认证,您将收到一个未授权的响应。

Lua 复制代码
HTTP/1.1 401 Unauthorized
...
{
   "message": "No API key found in request"
}

3. 发送错误的密钥

尝试使用错误的密钥访问该服务:

Lua 复制代码
curl -i http://localhost:8000/mock/anything \
 -H 'apikey:bad-key'

您将收到一个未授权的响应:

Lua 复制代码
HTTP/1.1 401 Unauthorized
...
{
 "message":"Invalid authentication credentials"
}

4. 发送一个有效的请求

在apikey头部中发送带有有效密钥的请求:

Lua 复制代码
curl -i http://localhost:8000/mock/anything \
 -H 'apikey:top-secret-key'

您将收到一个200 OK的响应。

基于服务的密钥认证

Key认证插件可以针对特定的服务启用。请求与上面相同,但是POST请求发送到服务的URL:

Lua 复制代码
  curl -X POST http://localhost:8001/services/example_service/plugins \
    --data name=key-auth
基于路由的密钥认证

Key认证插件可以针对特定的路由启用。请求与上面相同,但是POST请求发送到路由的URL:

Lua 复制代码
  curl -X POST http://localhost:8001/routes/example_route/plugins \
    --data name=key-auth

(可选)禁用插件

如果您按照此入门指南逐步操作,您将需要在以后的请求中使用此API密钥。如果您不想继续指定密钥,请在继续之前禁用插件。

1. 查找Key认证插件的ID

Lua 复制代码
curl -X GET http://localhost:8001/plugins/

您将收到一个包含id字段的JSON响应,类似于以下代码片段:

Lua 复制代码
...
"id": "2512e48d9-7by0-674c-84b7-00606792f96b"
...

2. 禁用插件

使用上面获得的插件ID对安装的Key认证插件上的enabled字段进行PATCH。您的请求将类似于以下内容,替换正确的插件ID:

Lua 复制代码
curl -X PATCH http://localhost:8001/plugins/2512e48d9-7by0-674c-84b7-00606792f96b \
 --data enabled=false

3. 测试已禁用的身份验证

现在您可以进行一个没有提供API密钥的请求:

Lua 复制代码
curl -i http://localhost:8000/mock/anything

您应该会收到:

Lua 复制代码
HTTP/1.1 200 OK
相关推荐
wclass-zhengge1 天前
SpringCloud篇(服务网关 - GateWay)
spring boot·spring cloud·gateway
H愚公移山H1 天前
Spring Cloud Alibaba [Gateway]网关。
java·gateway·springcloud
醇氧1 天前
【spring 】Spring Cloud Gateway 的Filter学习
学习·spring·gateway
蚰蜒螟1 天前
Spring gateway 路由 配置在数据库
数据库·spring·gateway
因我你好久不见2 天前
解决绿盟漏洞扫描 gateway、nacos、springboot tomcat检测到目标主机可能存在缓慢的HTTP拒绝服务攻击问题
spring boot·http·gateway
moxiaoran57535 天前
搭建Spring gateway网关微服务
spring·微服务·gateway
飞天大拖把5 天前
Zuul和GateWay
gateway
.生产的驴7 天前
SpringCloud Gateway网关路由配置 接口统一 登录验证 权限校验 路由属性
java·spring boot·后端·spring·spring cloud·gateway·rabbitmq
菜菜-plus8 天前
分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
java·分布式·微服务·nacos·gateway·springcloud·openfeign
七月在野,八月在宇,九月在户8 天前
前端--> nginx-->gateway产生的跨域问题分析
前端·nginx·gateway