认证是验证请求者是否有权限访问资源的过程。正如其名称所示,API网关认证用于验证数据在上游服务之间的流动。
Kong网关具有支持最常用的API网关认证方法的插件库。
常见的认证方法包括:
- 密钥认证
- 基本认证
- OAuth 2.0认证
- LDAP认证高级
- OpenID Connect
认证的好处
通过Kong网关控制认证,除非客户端成功认证,否则请求不会到达上游服务。这意味着上游服务处理经过预授权的请求,使它们摆脱了认证成本,节省了计算时间和开发工作量。
Kong网关可以查看所有的认证尝试,这提供了构建监控和警报功能的能力,支持服务的可用性和合规性。
开启认证
下面的教程介绍了如何在Kong网关中的各个方面启用密钥认证插件。
API密钥认证是强制API认证的常用方法。在密钥认证中,Kong网关用于生成并将API密钥与消费者关联起来。这个密钥是客户端在进行后续请求时呈现的认证凭据。根据呈现的密钥的有效性,Kong网关批准或拒绝请求。此过程可以全局应用或适用于单个服务和路由。
先决条件
这一章节是“开始使用Kong”系列的一部分。为了获得最佳体验,建议您从头开始按照系列进行操作。
从介绍开始,获取Kong,其中包括工具先决条件和运行本地Kong网关的说明。
指南的第二步“服务和路由”包括安装一个用于本系列的模拟服务的说明。
如果您尚未完成这些步骤,请在继续之前完成它们。
设置消费者和密钥
在Kong网关中,密钥认证通过使用消费者对象来实现。密钥分配给消费者,客户端应用程序在其发出的请求中呈现密钥。
1. 创建一个消费者
为了完成本教程,创建一个新的消费者,用户名为luka:
curl -i -X POST http://localhost:8001/consumers/ \
--data username=luka
您将收到一个201响应,表示已创建消费者。
2. 为消费者分配一个密钥
一旦配置完成,调用Admin API为新消费者分配一个密钥。对于本教程,将密钥值设置为top-secret-key:
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请求来启用:
curl -X POST http://localhost:8001/plugins/ \
--data "name=key-auth" \
--data "config.key_names=apikey"
您将收到一个201响应,表示插件已安装。
上述请求中的key_names配置字段定义了插件用于在认证请求时读取密钥的字段名称。插件将在请求的头部、查询字符串参数和请求体中查找该字段。
2. 发送一个未经身份验证的请求
尝试在未提供密钥的情况下访问该服务:
curl -i http://localhost:8000/mock/anything
由于您在全局启用了密钥认证,您将收到一个未授权的响应。
HTTP/1.1 401 Unauthorized
...
{
"message": "No API key found in request"
}
3. 发送错误的密钥
尝试使用错误的密钥访问该服务:
curl -i http://localhost:8000/mock/anything \
-H 'apikey:bad-key'
您将收到一个未授权的响应:
HTTP/1.1 401 Unauthorized
...
{
"message":"Invalid authentication credentials"
}
4. 发送一个有效的请求
在apikey头部中发送带有有效密钥的请求:
curl -i http://localhost:8000/mock/anything \
-H 'apikey:top-secret-key'
您将收到一个200 OK的响应。
基于服务的密钥认证
Key认证插件可以针对特定的服务启用。请求与上面相同,但是POST请求发送到服务的URL:
curl -X POST http://localhost:8001/services/example_service/plugins \
--data name=key-auth
基于路由的密钥认证
Key认证插件可以针对特定的路由启用。请求与上面相同,但是POST请求发送到路由的URL:
curl -X POST http://localhost:8001/routes/example_route/plugins \
--data name=key-auth
(可选)禁用插件
如果您按照此入门指南逐步操作,您将需要在以后的请求中使用此API密钥。如果您不想继续指定密钥,请在继续之前禁用插件。
1. 查找Key认证插件的ID
curl -X GET http://localhost:8001/plugins/
您将收到一个包含id字段的JSON响应,类似于以下代码片段:
...
"id": "2512e48d9-7by0-674c-84b7-00606792f96b"
...
2. 禁用插件
使用上面获得的插件ID对安装的Key认证插件上的enabled字段进行PATCH。您的请求将类似于以下内容,替换正确的插件ID:
curl -X PATCH http://localhost:8001/plugins/2512e48d9-7by0-674c-84b7-00606792f96b \
--data enabled=false
3. 测试已禁用的身份验证
现在您可以进行一个没有提供API密钥的请求:
curl -i http://localhost:8000/mock/anything
您应该会收到:
HTTP/1.1 200 OK