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

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

原创
作者头像
AIOPS
发布于 2023-11-14 12:05:26
发布于 2023-11-14 12:05:26
1.6K00
代码可运行
举报
文章被收录于专栏:高可用高可用
运行总次数:0
代码可运行

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
代码运行次数:0
运行
AI代码解释
复制
curl -i -X POST http://localhost:8001/consumers/  --data username=luka

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
curl -i -X POST http://localhost:8001/consumers/luka/key-auth  --data key=top-secret-key

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
curl -X POST http://localhost:8001/plugins/ --data"name=key-auth" --data"config.key_names=apikey"

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "enabled": true,
    "service": null,
    "consumer": null,
    "name": "key-auth",
    "id": "3e70c269-cb62-43e8-bce6-4258d7743eb5",
    ...
}

3.4 验证

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

3.4.1 发送未认证的请求

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -s http://localhost:8000/v1/api/random_value/ | jq
{
  "message": "No API key found in request"
}

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

3.4.2 发送错误的密钥

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
GEO 数据挖掘-数据获得
NCBI Gene Expression Omnibus(GEO)是各种高通量实验数据的公共存储库,这些数据包括测量mRNA、基因组DNA和蛋白质丰度的单通道和双通道微阵列实验,以及非阵列技术,如基因表达序列分析(SAGE)、质谱蛋白质组数据和高通量测序数据。相比较TCGA数据库,因为数据是用户上传,所以更新较快
火星娃统计
2020/09/15
2.1K0
GEO数据库表达数据的提取以及limma包进行差异分析
关于GEO数据库认识和在线使用教程,参考文章:GEO数据库使用教程及在线数据分析工具。关于GEO数据库的R包:Bioconductor:GEOquery包,我们前面已经介绍,当然是官方案例,我们这里实战一下。
DoubleHelix
2020/06/24
19.3K13
GEO数据库表达数据的提取以及limma包进行差异分析
解读GEO数据存放规律及下载,一文就够
做生物信息学分析的朋友应该是对GEO数据库耳熟能详了,总会用到公共数据库的,而GEO数据库则是首选,起先只是为表达芯片数据准备的,后期纳入了各种NGS组学数据,文章里面会给出数据地址,GSE ID号,
生信技能树
2018/03/29
4.7K0
解读GEO数据存放规律及下载,一文就够
R语言之GEO基因表达数据的下载整合
source("https://bioconductor.org/biocLite.R")
一粒沙
2019/07/31
10.2K0
R语言之GEO基因表达数据的下载整合
aglient芯片原始数据处理
我多次在学徒作业强调了 3大基因芯片产商里面,就Agilent公司的芯片比较难搞,比如Agilent芯片表达矩阵处理(学徒作业) 以及 oligo包可以处理agilent芯片吗,这个作业难度非常高,不过我们生信技能树优秀讲师:小洁在繁重的授课压力下抽空整理了相关数据处理经验分享给大家,下面看她的表演:
生信技能树
2020/06/11
3.7K1
aglient芯片原始数据处理
geo数据挖掘-2
对下载的数据进行处理,提取表达矩阵,并匹配探针信息,基因名 教程来自:https://github.com/jmzeng1314/GEO/
火星娃统计
2020/09/15
1.3K0
geo数据挖掘-2
怎么样才能正确的学习生信分析呢?—从学徒做起
(PS : 需要排除部分根本就无心向学的,也许是没有时间,也许是畏难。总之,没有学习条件哪怕是找到我,我也无能为力哈)
生信技能树
2020/03/10
3.8K0
怎么样才能正确的学习生信分析呢?—从学徒做起
使用Mfuzz包做时间序列分析
既然是讲解时间序列分析,那么就不得不提一下Mfuzz包了,恰好生信技能树创始人jimmy的200篇生物信息学文献阅读活动分享过的一篇文章就有这个,作者主要使用了第一个结果中差异表达分析得到的13,247 个差异基因列表(使用的是传统的T检验,对任意两组的组合找差异,最后合并)。
生信技能树
2020/09/30
3.5K0
使用Mfuzz包做时间序列分析
芯片数据分析,so easy?
我最早接触的高通量数据就是RNA-seq,后来接触的也基本是高通量测序结果而不是芯片数据,因此我从来没有分析过一次芯片数据,而最近有一个学员在看生信技能树在腾讯课堂发布的课程GEO数据库表达芯片处理之R语言流程(阅读原文购买)遇到了问题问我请教,为了解决这个问题,我花了一个晚上时间学习这方面的分析。
生信技能树
2018/07/27
2.5K0
芯片数据分析,so easy?
PGSEA和GSVA你会怎么选择呢?
it tests for each sample whether the average expression of genes in a gene sets deviates from the overall average expression (expression of all genes in all samples).
生信技能树
2018/07/27
1.3K0
从零开始的异世界生信学习 GEO数据库数据挖掘--GEO代码-芯片数据分析-1
在列表中取子集后得到"ExpressionSet"结构数据,为"Biobase"包中的数据形式
用户10361520
2023/03/09
1.1K0
GEO数据分析流程之芯片1
提取的转化后的eSet格式为ExpressionSet 可以被Biobase(R包)提取
生信菜鸟团
2024/06/28
1030
GEO数据分析流程之芯片1
GEO数据库的每个GPL平台对应的详细信息获取txt文本文件
一般来说,GEO数据库的每个GPL平台都有对应的网页,而且可以获取其详细信息的txt文本文件,比如:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc
生信技能树
2023/09/04
1.5K0
GEO数据库的每个GPL平台对应的详细信息获取txt文本文件
ChAMP分析甲基化数据:从β值矩阵开始的流程
之前的推文详细介绍了ChMAP包从IDAT文件开始的甲基化数据分析流程,今天说一下从β矩阵开始的甲基化分析流程。
医学和生信笔记
2022/11/15
1.1K0
ChAMP分析甲基化数据:从β值矩阵开始的流程
三阴性乳腺癌表达矩阵探索之数据下载及理解
对文献解读的第三篇文章==Identification of Key Genes and Pathways in Triple-Negative Breast Cancer by Integrated Bioinformatics Analysis== 的分析过程进行重复
生信技能树
2020/10/26
2.1K0
三阴性乳腺癌表达矩阵探索之数据下载及理解
GEO数据挖掘-基于芯片
在require()函数中,如果直接传递包的名称作为参数,不需要加引号;如果包的名称以字符串形式存储在变量中,则需要使用character.only = TRUE来指定这个变量是一个字符串
sheldor没耳朵
2024/07/23
3940
GEO数据挖掘-基于芯片
Day08 生信马拉松-GEO数据挖掘 (上)
文章所有内容均来自生信技能树“生信马拉松-数据挖掘班”授课内容个人整理,如需转载请注明出处。
大冬仔
2023/08/19
6330
GEO数据库(一)
2、本地安装:从github官网上R包界面下载到本地,并放到当前工作目录下,使用如下命令:
祈祈
2023/04/26
1.3K0
GEO数据分析流程之芯片1补充
提取的转化后的eSet格式为ExpressionSet 可以被Biobase(R包)提取。(狭义的对象,是被R包的作者定义的)。
生信菜鸟团
2024/06/28
1330
GEO数据分析流程之芯片1补充
GEO数据挖掘流程+STRING VS R in KEGG/GO
In molecular biology, STRING (Search Tool for the Retrieval of Interacting Genes/Proteins) is a biological database and web resource of known and predicted protein–protein interactions.(from Wkkipedia)
生信技能树
2019/05/15
3.5K0
GEO数据挖掘流程+STRING VS R in KEGG/GO
推荐阅读
相关推荐
GEO 数据挖掘-数据获得
更多 >
LV.6
软通动力信息技术(集团)股份有限高级工程师
目录
  • 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. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档