前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务系列:通过Kong网关给API加Key鉴权

微服务系列:通过Kong网关给API加Key鉴权

原创
作者头像
AIOPS
发布2023-11-14 20:05:26
6921
发布2023-11-14 20:05:26
举报
文章被收录于专栏:高可用高可用

1. 背景

上篇文章讲了通过Kong网关给API限流,这篇文章我们就讲讲API的另一个特性:鉴权。

Kong网关作为API网关,提供了多种认证机制以确保API安全性,它允许开发者和企业在API上游和下游之间搭建一个可靠的访问控制系统。以下是Kong网关支持的几种常见的认证类型,以及Key Auth插件的实战。

微服务系列传送门:

1、 为什么需要API网关

2、 Kong初探

3、 Kong安装配置

4、 通过Kong提供API服务

5、 通过Kong网关给API限流

2. Kong网关鉴权

2.1 Kong网关支持的认证类型

➢ 密钥认证(Key Authentication): 用户需通过API密钥通过认证才能访问API资源。密钥可以作为请求头、查询参数或者请求体中的一部分发送。

➢ 基础认证(Basic Authentication): 用HTTP标准的基础认证方式,通过用户名和密码组合,经过Base64编码后发送给服务器。

➢ OAuth 2.0认证: 提供了一个安全的访问控制框架,允许用户给第三方应用授权,在不暴露用户凭证的情况下访问API。

➢ LDAP高级认证(LDAP Authentication Advanced): 通过轻量级目录访问协议(LDAP)进行用户认证,通常用于企业环境中用户的身份验证。

➢ OpenID Connect: 基于OAuth 2.0的身份层,用于认证并获取用户基本信息,在现代应用中非常流行。

2.2 Key Auth(密钥认证)是什么?

Key Auth是Kong网关中的一个插件,它将API密钥绑定到消费者对象并通过这个密钥来管理对API资源的访问。在客户端发起请求时,它必须在请求中携带一个有效的API密钥。该密钥可以在请求头(headers)、查询字符串(query string)或请求体(request body)中传输。Key Auth主要在用于客户端认证时保护API,防止未经授权的访问。

3. Key认证实战

3.1 创建一个新的消费者

使用用户名luka创建一个新的消费者:

代码语言:javascript
复制
curl -i -X POST http://localhost:8001/consumers/  --data username=luka

返回结果如下,表示消费者已创建。

代码语言:javascript
复制
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}

3.2 为消费者分配一个密钥

配置完成后,调用Admin API为新消费者分配一个密钥。将密钥值设置为top-secret-key(仅作为示例):

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

返回结果如下,表示密钥已经被创建。

代码语言:javascript
复制
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"}}

3.3 全局密钥认证

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

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

返回结果如下,表示插件已安装。

代码语言:javascript
复制
{
    "enabled": true,
    "service": null,
    "consumer": null,
    "name": "key-auth",
    "id": "3e70c269-cb62-43e8-bce6-4258d7743eb5",
    ...
}

3.4 验证

使用我们在通过Kong提供API服务一文中提供的URL,完成下面的测试

3.4.1 发送未认证的请求

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

代码语言:javascript
复制
curl -s http://localhost:8000/v1/api/random_value/ | jq
{
  "message": "No API key found in request"
}

由于你已经全局启用了密钥认证,你将收到未授权的响应.

3.4.2 发送错误的密钥

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

代码语言:javascript
复制
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"
}

提示错误的凭据

3.4.3 使用有效的密钥发送含apikey头部的请求:

curl -i http://localhost:8000/abc/anything -H'apikey:top-secret-key'

代码语言:javascript
复制
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鉴权。大家自行探索

4. 总结

本文讲了Kong网关的Key认证,相对于其他认证方式,这种认证非常简单直观,只需要传递个key,就可以对API鉴权,特别适合API服务的场景。

但是Kong与第三方OAuth对接,需要升级到企业版的Kong,对中小企业不太友好。如果仅仅提供API访问、不需要复杂鉴权,个人认为Kong还是适合使用的。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2. Kong网关鉴权
    • 2.1 Kong网关支持的认证类型
      • 2.2 Key Auth(密钥认证)是什么?
      • 3. Key认证实战
        • 3.1 创建一个新的消费者
          • 3.2 为消费者分配一个密钥
            • 3.3 全局密钥认证
              • 3.4 验证
                • 3.4.1 发送未认证的请求
                • 3.4.2 发送错误的密钥
                • 3.4.3 使用有效的密钥发送含apikey头部的请求:
            • 4. 总结
            相关产品与服务
            多因子身份认证
            多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档