上篇文章讲了通过Kong网关给API限流,这篇文章我们就讲讲API的另一个特性:鉴权。
Kong网关作为API网关,提供了多种认证机制以确保API安全性,它允许开发者和企业在API上游和下游之间搭建一个可靠的访问控制系统。以下是Kong网关支持的几种常见的认证类型,以及Key Auth插件的实战。
微服务系列传送门:
1、 为什么需要API网关
2、 Kong初探
3、 Kong安装配置
➢ 密钥认证(Key Authentication): 用户需通过API密钥通过认证才能访问API资源。密钥可以作为请求头、查询参数或者请求体中的一部分发送。
➢ 基础认证(Basic Authentication): 用HTTP标准的基础认证方式,通过用户名和密码组合,经过Base64编码后发送给服务器。
➢ OAuth 2.0认证: 提供了一个安全的访问控制框架,允许用户给第三方应用授权,在不暴露用户凭证的情况下访问API。
➢ LDAP高级认证(LDAP Authentication Advanced): 通过轻量级目录访问协议(LDAP)进行用户认证,通常用于企业环境中用户的身份验证。
➢ OpenID Connect: 基于OAuth 2.0的身份层,用于认证并获取用户基本信息,在现代应用中非常流行。
Key Auth是Kong网关中的一个插件,它将API密钥绑定到消费者对象并通过这个密钥来管理对API资源的访问。在客户端发起请求时,它必须在请求中携带一个有效的API密钥。该密钥可以在请求头(headers)、查询字符串(query string)或请求体(request body)中传输。Key Auth主要在用于客户端认证时保护API,防止未经授权的访问。
使用用户名luka创建一个新的消费者:
curl -i -X POST http://localhost:8001/consumers/ --data username=luka
返回结果如下,表示消费者已创建。
HTTP/1.1 201 Created
Date: Tue, 14 Nov 2023 11:54:54 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
X-Kong-Admin-Request-ID: GMqdBYiKT8NqXDHhnp4SrRvcQ6LSQZAN
Content-Length: 173
X-Kong-Admin-Latency: 34
Server: kong/3.4.1.1-enterprise-edition
{"custom_id":null,"type":0,"id":"c27cc554-c1a7-4c6e-856f-1f6d44c85480","username":"luka","created_at":1699962894,"updated_at":1699962894,"username_lower":"luka","tags":null}
配置完成后,调用Admin API为新消费者分配一个密钥。将密钥值设置为top-secret-key(仅作为示例):
curl -i -X POST http://localhost:8001/consumers/luka/key-auth --data key=top-secret-key
返回结果如下,表示密钥已经被创建。
HTTP/1.1 201 Created
Date: Tue, 14 Nov 2023 11:56:49 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
X-Kong-Admin-Request-ID: dqzhpJMcWMsortRn7r8KFiKnezu1Mj4a
Content-Length: 172
X-Kong-Admin-Latency: 17
Server: kong/3.4.1.1-enterprise-edition
{"created_at":1699963008,"key":"top-secret-key","id":"be148421-16e1-48b5-aa95-eed15695da65","ttl":null,"tags":null,"consumer":{"id":"c27cc554-c1a7-4c6e-856f-1f6d44c85480"}}
通过下面命令启用密钥认证,密钥认证插件默认安装在Kong网关上,可以通过向Admin API上的plugins对象发送POST请求来启用:
curl -X POST http://localhost:8001/plugins/ --data"name=key-auth" --data"config.key_names=apikey"
返回结果如下,表示插件已安装。
{
"enabled": true,
"service": null,
"consumer": null,
"name": "key-auth",
"id": "3e70c269-cb62-43e8-bce6-4258d7743eb5",
...
}
使用我们在通过Kong提供API服务一文中提供的URL,完成下面的测试
尝试在未提供密钥的情况下访问服务:
curl -s http://localhost:8000/v1/api/random_value/ | jq
{
"message": "No API key found in request"
}
由于你已经全局启用了密钥认证,你将收到未授权的响应.
尝试使用错误的密钥访问服务:
curl -i http://localhost:8000/v1/api/random_value/ -H 'apikey:bad-key'
HTTP/1.1 401 Unauthorized
Date: Tue, 14 Nov 2023 12:01:12 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 52
X-Kong-Response-Latency: 1
Server: kong/3.4.1.1-enterprise-edition
{
"message":"Invalid authentication credentials"
}
提示错误的凭据
curl -i http://localhost:8000/abc/anything -H'apikey:top-secret-key'
curl -i http://localhost:8000/v1/api/random_value/ -H'apikey:top-secret-key'
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 57
Connection: keep-alive
Server: gunicorn
Date: Tue, 14 Nov 2023 12:01:59 GMT
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: same-origin
Cross-Origin-Opener-Policy: same-origin
X-Kong-Upstream-Latency: 105
X-Kong-Proxy-Latency: 6
Via: kong/3.4.1.1-enterprise-edition
{"address": "127.0.0.1:8081", "hostname": "7f1edf0ec3f1"}
访问成功。
除此之外,Kong网关还支持基于服务的Key鉴权,也支持基于路由的Key鉴权。大家自行探索
本文讲了Kong网关的Key认证,相对于其他认证方式,这种认证非常简单直观,只需要传递个key,就可以对API鉴权,特别适合API服务的场景。
但是Kong与第三方OAuth对接,需要升级到企业版的Kong,对中小企业不太友好。如果仅仅提供API访问、不需要复杂鉴权,个人认为Kong还是适合使用的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。