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
相关推荐
程序员爱中国20 小时前
GateWay服务网关
gateway·服务网关
TOMORROW6COME3 天前
SpringCloud-服务网关-Gateway
spring·spring cloud·gateway
读书笔记控4 天前
计算机相关术语科普之什么叫网关(Gateway)
gateway
Lill_bin5 天前
面试题--SpringBoot
spring boot·后端·spring·spring cloud·zookeeper·gateway·mybatis
怪兽也会哭哭6 天前
微服务应用与开发知识点练习【Gateway,OpenFeign,Dubbo,RocketMQ和RabbitMQ,JPA,Redis,Mycat】
微服务·gateway·rabbitmq·dubbo·rocketmq
怪兽也会哭哭6 天前
Spring Cloud Alibaba之网关组件Gateway
spring boot·gateway·学习笔记
池塘边的菜园子7 天前
学习gateway网关路由时遇到的问题
网络·学习·gateway
池塘边的菜园子7 天前
微服务-网关Gateway
linux·微服务·gateway
请叫我鹏鹏君8 天前
微服务 | Springboot整合GateWay+Nacos实现动态路由
spring boot·微服务·gateway
luo♛8 天前
微服务-网关
java·分布式·spring cloud·微服务·架构·gateway