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
相关推荐
柳叶寒2 天前
医院信息化与智能化系统(17)
java·nacos·gateway·全栈·项目
cyt涛2 天前
SpringCloudGateway — 网关路由
java·开发语言·网关·gateway·路由·断言·转发
风霜不见闲沉月2 天前
kong网关的使用
junit·kong
代码魔法师Sunny4 天前
502 Bad Gateway 错误详解:从表现推测原因,逐步排查直至解决
gateway
RedCong5 天前
通过route访问Openshift上的HTTP request报错504 Gateway Time-out【已解决】
http·gateway·openshift
飞升不如收破烂~6 天前
包括 Nginx、Gateway、Nacos、Dubbo、Sentinel、RocketMQ 和 Seata 的调用链路描述:
nginx·gateway·dubbo
还是转转6 天前
Kong Gateway 指南
gateway·kong
攒了一袋星辰11 天前
微服务网关gateway过滤器工厂与自定义过滤器
微服务·架构·gateway
猫猫不是喵喵.12 天前
Gateway 统一网关
java·网络·微服务·gateway
12 天前
504 Gateway Time-outopenresty
gateway