API 網(wǎng)關(guān) Kong 實(shí)戰(zhàn)

1.Kong 介紹

Kong 是一款基于 OpenResty(Nginx + Lua 模塊)編寫(xiě)的高可用潮峦、易擴(kuò)展的酱床,由 Mashape 公司開(kāi)源的 API Gateway 項(xiàng)目除呵。Kong 是基于 NGINX 和 Apache Cassandra 或 PostgreSQL 構(gòu)建的吼渡,能提供易于使用的 RESTful API 來(lái)操作和配置 API 管理系統(tǒng)宋彼,所以它可以水平擴(kuò)展多個(gè) Kong 服務(wù)器酷誓,通過(guò)前置的負(fù)載均衡配置把請(qǐng)求均勻地分發(fā)到各個(gè) Server赫悄,來(lái)應(yīng)對(duì)大批量的網(wǎng)絡(luò)請(qǐng)求原献。

官網(wǎng): https://konghq.com/

Kong 主要有三個(gè)組件:

  1. Kong Server :基于 nginx 的服務(wù)器馏慨,用來(lái)接收 API 請(qǐng)求。

  2. Apache Cassandra/PostgreSQL :用來(lái)存儲(chǔ)操作數(shù)據(jù)姑隅。

  3. Kong dashboard:官方推薦 UI 管理工具写隶,當(dāng)然,也可以使用 restfull 方式 管理 admin api讲仰。

Kong 采用插件機(jī)制進(jìn)行功能定制慕趴,插件集(可以是 0 或 N 個(gè))在 API 請(qǐng)求響應(yīng)循環(huán)的生命周期中被執(zhí)行。插件使用 Lua 編寫(xiě)鄙陡,目前已有幾個(gè)基礎(chǔ)功能:HTTP 基本認(rèn)證冕房、密鑰認(rèn)證、CORS(Cross-Origin Resource Sharing趁矾,跨域資源共享)耙册、TCP、UDP毫捣、文件日志详拙、API 請(qǐng)求限流、請(qǐng)求轉(zhuǎn)發(fā)以及 Nginx 監(jiān)控蔓同。

1.1 Kong 網(wǎng)關(guān)的特性

Kong 網(wǎng)關(guān)具有以下的特性:

  • 可擴(kuò)展性: 通過(guò)簡(jiǎn)單地添加更多的服務(wù)器饶辙,可以輕松地進(jìn)行橫向擴(kuò)展,這意味著您的平臺(tái)可以在一個(gè)較低負(fù)載的情況下處理任何請(qǐng)求斑粱;

  • 模塊化: 可以通過(guò)添加新的插件進(jìn)行擴(kuò)展弃揽,這些插件可以通過(guò) RESTful Admin API 輕松配置;

  • 在任何基礎(chǔ)架構(gòu)上運(yùn)行: Kong 網(wǎng)關(guān)可以在任何地方都能運(yùn)行珊佣。您可以在云或內(nèi)部網(wǎng)絡(luò)環(huán)境中部署 Kong蹋宦,包括單個(gè)或多個(gè)數(shù)據(jù)中心設(shè)置,以及 public咒锻,private 或 invite-only APIs冷冗。

1.2 Kong 網(wǎng)關(guān)架構(gòu)

  1. Kong 核心基于 OpenResty 構(gòu)建,實(shí)現(xiàn)了請(qǐng)求/響應(yīng)的 Lua 處理化惑艇;

  2. Kong 插件攔截請(qǐng)求/響應(yīng)蒿辙;

  3. Kong Restful 管理 API 提供了 API/API 消費(fèi)者/插件的管理;

  4. 數(shù)據(jù)中心用于存儲(chǔ) Kong 集群節(jié)點(diǎn)信息滨巴、API思灌、消費(fèi)者、插件等信息恭取,目前提供了 PostgreSQL 和 Cassandra 支持泰偿,如果需要高可用建議使用 Cassandra;

  5. Kong 集群中的節(jié)點(diǎn)通過(guò) gossip 協(xié)議自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn)蜈垮,當(dāng)通過(guò)一個(gè) Kong 節(jié)點(diǎn)的管理 API 進(jìn)行一些變更時(shí)也會(huì)通知其他節(jié)點(diǎn)耗跛。每個(gè) Kong 節(jié)點(diǎn)的配置信息是會(huì)緩存的裕照,如插件,那么當(dāng)在某一個(gè) Kong 節(jié)點(diǎn)修改了插件配置時(shí)调塌,需要通知其他節(jié)點(diǎn)配置的變更晋南。

2.Kong 環(huán)境搭建

2.1 基于 centos7 搭建

環(huán)境: PostgreSQL 9.6 + CentOS 7

2.1.1 PostgreSQL

下載地址:https://www.postgresql.org/download/linux/redhat/

安裝命令

選擇 PostgreSQL 9.6 + CentOS 7 后獲得安裝方式:

啟動(dòng) postgresql 后查看狀態(tài):

配置 postgresql

為了安全以及滿足 Kong 初始化的需求,需要?jiǎng)?chuàng)建一個(gè) Linux 用戶 kong羔砾,并創(chuàng)建對(duì)應(yīng)的 PostgreSQL 用戶 kong 和數(shù)據(jù)庫(kù) kong

# 創(chuàng)建一個(gè) Linux 用戶 `kong`

復(fù)制代碼

PostgreSQL 有四種身份認(rèn)證方式:

  • trust:凡是連接到服務(wù)器的负间,都是可信任的。只需要提供 PostgreSQL 用戶名姜凄,可以沒(méi)有對(duì)應(yīng)的操作系統(tǒng)同名用戶政溃。

  • password 和 md5:對(duì)于遠(yuǎn)程訪問(wèn),需要提供 PostgreSQL 用戶名和密碼态秧。對(duì)于本地連接玩祟,提供 PostgreSQL 用戶名密碼之外,還需要有操作系統(tǒng)訪問(wèn)權(quán)(用操作系統(tǒng)同名用戶驗(yàn)證)屿聋。password 和 md5 的區(qū)別,就是遠(yuǎn)程訪問(wèn)時(shí)傳輸?shù)拿艽a是否用 md5 加密藏鹊。

  • ident:對(duì)于遠(yuǎn)程訪問(wèn)润讥,從 ident 服務(wù)器獲得客戶端操作系統(tǒng)用戶名,然后把操作系統(tǒng)作為數(shù)據(jù)庫(kù)用戶名進(jìn)行登錄對(duì)于本地連接盘寡,實(shí)際上使用了 peer楚殿。

  • peer:對(duì)于本地訪問(wèn),通過(guò)客戶端操作系統(tǒng)內(nèi)核來(lái)獲取當(dāng)前系統(tǒng)登錄的用戶名竿痰,并作為 PostgreSQL 用戶名進(jìn)行登錄脆粥。

默認(rèn)配置下,我們無(wú)法在本地或者遠(yuǎn)程使用 PostgreSQL 用戶名和密碼直接連接影涉,因?yàn)楸镜厥褂?peer 認(rèn)證方式变隔,遠(yuǎn)程使用 ident 認(rèn)證方式。解決方法比較簡(jiǎn)單蟹倾,將本地和遠(yuǎn)程的認(rèn)證方式修改成 trust 或者 password 即可匣缘。

修改 /var/lib/pgsql/9.6/data/pg_hba.conf 文件,注釋掉所有默認(rèn)配置鲜棠,并添加一條 host all all 0.0.0.0/0 trust 默認(rèn)肌厨,無(wú)論遠(yuǎn)程還是本地訪問(wèn),任何 PostgreSQL 用戶和數(shù)據(jù)庫(kù)豁陆,都使用 trust 認(rèn)證方式柑爸。

默認(rèn)配置下,PostgreSQL 只允許本地連接盒音,所以我們需要修改 /var/lib/pgsql/9.6/data/postgresql.conf 文件表鳍,添加 listen_address 配置項(xiàng)為 *馅而,允許遠(yuǎn)程連接。

修改完成后进胯,執(zhí)行 sudo systemctl restart postgresql-9.6 命令用爪,重啟 PostgreSQL 數(shù)據(jù)庫(kù)。

通過(guò) Navicat 可以連接到 postgresql 數(shù)據(jù)庫(kù):

2.1.2 安裝 kong

centos7 下安裝 kong:

https://download.konghq.com/gateway-1.x-centos-7/Packages/k/

安裝命令

sudo yum install kong-1.5.1.el7.amd64.rpm </code>

復(fù)制代碼

配置 kong

Kong 的默認(rèn)配置文件是 /etc/kong/kong.conf.default胁镐,使用 cp /etc/kong/kong.conf.default /etc/kong/kong.conf 命令偎血,復(fù)制一份新的配置文件。

復(fù)制完成后盯漂,修改 /etc/kong/kong.conf 配置文件颇玷,設(shè)置使用 PostgreSQL 數(shù)據(jù)庫(kù)。

執(zhí)行 kong migrations bootstrap -c /etc/kong/kong.conf 命令就缆,進(jìn)行 Kong 的 PostgreSQL 數(shù)據(jù)庫(kù)的表初始化帖渠。

navicat 中可以看到表信息

執(zhí)行 kong start -c /etc/kong/kong.conf 命令,執(zhí)行 Kong 的啟動(dòng)竭宰。

<code data-type="codeline">#啟動(dòng)命令</code><code data-type="codeline">kong start -c /etc/kong/kong.conf </code><code data-type="codeline"># 停止命令</code><code data-type="codeline">kong stop</code><code data-type="codeline"># 重新加載kong</code><code data-type="codeline">kong reload</code></pre>

復(fù)制代碼

啟動(dòng)成功時(shí)空郊,會(huì)看到 Kong started 日志。

默認(rèn)情況下切揭,Kong 綁定 4 個(gè)端口:

  • Proxy 8000:接收客戶端的 HTTP 請(qǐng)求狞甚,并轉(zhuǎn)發(fā)到后端的 Upstream。

  • Proxy 8443:接收客戶端的 HTTPS 請(qǐng)求廓旬,并轉(zhuǎn)發(fā)到后端的 Upstream哼审。

  • Admin 8001:接收管理員的 HTTP 請(qǐng)求,進(jìn)行 Kong 的管理孕豹。

  • Admin 8444:接收管理員的 HTTPS 請(qǐng)求涩盾,進(jìn)行 Kong 的管理。

# 請(qǐng)求 Proxy 端口

復(fù)制代碼

2.2 基于 docker 搭建

前提:準(zhǔn)備好 docker 環(huán)境

image

Kong 安裝有兩種方式一種是沒(méi)有數(shù)據(jù)庫(kù)依賴的 DB-less 模式励背,另一種是 with a Database 模式春霍。我們這里使用第二種帶 Database 的模式,因?yàn)檫@種模式功能更全叶眉。

2.2.1 docker 安裝 Kong

構(gòu)建 Kong 的容器網(wǎng)絡(luò)

首先我們創(chuàng)建一個(gè) Docker 自定義網(wǎng)絡(luò)终畅,以允許容器相互發(fā)現(xiàn)和通信。在下面的創(chuàng)建命令中 kong-net 是我們創(chuàng)建的 Docker 網(wǎng)絡(luò)名稱竟闪,當(dāng)然你可以使用你認(rèn)為合適的名稱离福。

docker network create kong-net
復(fù)制代碼

搭建數(shù)據(jù)庫(kù)環(huán)境

Kong 目前使用 Cassandra(Facebook 開(kāi)源的分布式的 NoSQL 數(shù)據(jù)庫(kù)) 或者 PostgreSql,你可以執(zhí)行以下命令中的一個(gè)來(lái)選擇你的 Database。請(qǐng)注意定義網(wǎng)絡(luò) --network=kong-net 炼蛤。

  • Cassandra 容器:
<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline">           --network=kong-net \</code><code data-type="codeline">           -p 9042:9042 \</code><code data-type="codeline">           cassandra:3</code></pre>

復(fù)制代碼

  • PostgreSQL 容器:
<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline">           --network=kong-net \</code><code data-type="codeline">           -p 5432:5432 \</code><code data-type="codeline">           -e "POSTGRES_USER=kong" \</code><code data-type="codeline">           -e "POSTGRES_DB=kong" \</code><code data-type="codeline">           postgres:9.6</code>

復(fù)制代碼

這里有個(gè)小問(wèn)題妖爷。如果你使用的是 PostgreSQL,想掛載卷持久化數(shù)據(jù)到宿主機(jī)。通過(guò) -v 命令是不好用的絮识。這里推薦你使用 docker volume create 命令來(lái)創(chuàng)建一個(gè)掛載绿聘。

docker volume create kong-volume

復(fù)制代碼

然后上面的 PostgreSQL 就可以通過(guò) - v kong-volume:/var/lib/postgresql/data 進(jìn)行掛載了。

<code data-type="codeline">docker run -d --name kong-database \</code><code data-type="codeline">           --network=kong-net \</code><code data-type="codeline">           -p 5432:5432 \</code><code data-type="codeline">           -v kong-volume:/var/lib/postgresql/data \</code><code data-type="codeline">           -e "POSTGRES_USER=kong" \</code><code data-type="codeline">           -e "POSTGRES_DB=kong" \</code><code data-type="codeline">           -e "POSTGRES_PASSWORD=kong"  \</code><code data-type="codeline">           postgres:9.6</code>

初始化或者遷移數(shù)據(jù)庫(kù)

我們使用 docker run --rm 來(lái)初始化數(shù)據(jù)庫(kù)次舌,該命令執(zhí)行后會(huì)退出容器而保留內(nèi)部的數(shù)據(jù)卷(volume)熄攘。

<code data-type="codeline">docker run --rm \</code><code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -e "KONG_DATABASE=postgres" \</code><code data-type="codeline"> -e "KONG_PG_HOST=kong-database" \</code><code data-type="codeline"> -e "KONG_PG_PASSWORD=kong" \</code><code data-type="codeline"> -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \</code><code data-type="codeline"> kong:latest kong migrations bootstrap</code>

navicat 中可以看到表信息

啟動(dòng) Kong 容器

完成初始化或者遷移數(shù)據(jù)庫(kù)后,我們就可以啟動(dòng)一個(gè)連接到數(shù)據(jù)庫(kù)容器的 Kong 容器彼念,請(qǐng)務(wù)必保證你的數(shù)據(jù)庫(kù)容器啟動(dòng)狀態(tài)挪圾,同時(shí)檢查所有的環(huán)境參數(shù) -e 是否是你定義的環(huán)境。

<code data-type="codeline"> --network=kong-net \</code><code data-type="codeline"> -e "KONG_DATABASE=postgres" \</code><code data-type="codeline"> -e "KONG_PG_HOST=kong-database" \</code><code data-type="codeline"> -e "KONG_PG_PASSWORD=kong" \</code><code data-type="codeline"> -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \</code><code data-type="codeline"> -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \</code><code data-type="codeline"> -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \</code><code data-type="codeline"> -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \</code><code data-type="codeline"> -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \</code><code data-type="codeline"> -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \</code><code data-type="codeline"> -p 8000:8000 \</code><code data-type="codeline"> -p 8443:8443 \</code><code data-type="codeline"> -p 8001:8001 \</code><code data-type="codeline"> -p 8444:8444 \</code><code data-type="codeline"> kong:latest</code></pre>

驗(yàn)證

可通過(guò) curl -i http://192.168.65.200:8001/ 或者瀏覽器調(diào)用 http://192.168.65.200:8001/ 來(lái)驗(yàn)證 Kong Admin 是否聯(lián)通 逐沙。

2.3 安裝 Kong 管理 UI

Kong 企業(yè)版提供了管理 UI哲思,開(kāi)源版本是沒(méi)有的。但是有很多的開(kāi)源的管理 UI 吩案,其中比較好用的是 Konga棚赔。項(xiàng)目地址: https://github.com/pantsel/konga

Konga 主要是用 AngularJS 寫(xiě)的,運(yùn)行于 nodejs 服務(wù)端徘郭。具有以下特性:

  • 管理所有 Kong Admin API 對(duì)象靠益。

  • 支持從遠(yuǎn)程源(數(shù)據(jù)庫(kù),文件残揉,API 等)導(dǎo)入使用者捆毫。

  • 管理多個(gè) Kong 節(jié)點(diǎn)。使用快照備份冲甘,還原和遷移 Kong 節(jié)點(diǎn)。

  • 使用運(yùn)行狀況檢查監(jiān)視節(jié)點(diǎn)和 API 狀態(tài)途样。

  • 支持電子郵件和閑置通知江醇。

  • 支持多用戶。

  • 易于數(shù)據(jù)庫(kù)集成(MySQL何暇,postgresSQL陶夜,MongoDB,SQL Server)裆站。

docker volume create konga-postgresql

<code data-type="codeline">docker run -d --name konga-database  \</code><code data-type="codeline">  --network=kong-net  \</code><code data-type="codeline">                    -p 5433:5432 \</code><code data-type="codeline">                    -v  konga-postgresql:/var/lib/postgresql/data  \</code><code data-type="codeline">                    -e "POSTGRES_USER=konga"  \</code><code data-type="codeline">                    -e "POSTGRES_DB=konga" \</code><code data-type="codeline">                    -e "POSTGRES_PASSWORD=konga"  \</code><code data-type="codeline">                    postgres:9.6</code>

初始化 PostgreSQL 數(shù)據(jù)庫(kù)

<code data-type="codeline">docker run --rm  --network=kong-net  \</code><code data-type="codeline">                       pantsel/konga:latest -c prepare -a postgres -u postgres://konga:konga@konga-database:5432/konga</code>

復(fù)制代碼

相關(guān)命令解讀:

到此 Konga 的數(shù)據(jù)庫(kù)環(huán)境就搞定了条辟,通過(guò) Navicat 可以查看到 konga 數(shù)據(jù)庫(kù)及其數(shù)據(jù)表。

環(huán)境參數(shù)

Konga 還有一些可配置的環(huán)境參數(shù):

啟動(dòng) Konga

通過(guò)以下命令就可以啟動(dòng) Konga 容器了

<code data-type="codeline">docker run -d -p 1337:1337  \</code><code data-type="codeline">               --network kong-net  \</code><code data-type="codeline">               -e "DB_ADAPTER=postgres"  \</code><code data-type="codeline">               -e "DB_URI=postgres://konga:konga@konga-database:5432/konga"  \</code><code data-type="codeline">               -e "NODE_ENV=production"  \</code><code data-type="codeline">               -e "DB_PASSWORD=konga" \</code><code data-type="codeline">               --name konga \</code><code data-type="codeline">               pantsel/konga</code>

運(yùn)行完后宏胯,如果成功可以通過(guò) http://192.168.65.200:1337/ 鏈接到控制臺(tái)羽嫡。

通過(guò)注冊(cè)后進(jìn)入,然后在 dashboard 面板里面添加 Kong 的管理 Api 路徑 http://ip:8001

3. Kong 快速開(kāi)始

3.1 動(dòng)態(tài)負(fù)載均衡實(shí)現(xiàn)

nginx 下負(fù)載均衡配置

upstream tulingmall-product-upstream {

復(fù)制代碼

通過(guò) Kong Admin API 進(jìn)行上述的負(fù)載均衡的配置

https://docs.konghq.com/enterprise/2.4.x/admin-api/

創(chuàng)建 upstream 和 target

調(diào)用 Kong Admin API /upstreams 肩袍,創(chuàng)建名字為 demo-upstreamupstream

$ curl -X POST http://127.0.0.1:8001/upstreams --data "name=tulingmall-product-upstream"

調(diào)用 Kong Admin API /upstreams/{upstream}/targets 杭棵,創(chuàng)建 tulingmall-product 服務(wù)對(duì)應(yīng)的 2 個(gè) target 。注意氛赐, {upstream} 路徑參數(shù)為 upstream 的名字魂爪。

<code data-type="codeline"># 192.168.65.190:8866 對(duì)應(yīng)的 target</code><code data-type="codeline">$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8866" --data "weight=100"</code><code data-type="codeline"># 192.168.65.190:8867 對(duì)應(yīng)的 target</code><code data-type="codeline">$ curl -X POST http://127.0.0.1:8001/upstreams/tulingmall-product-upstream/targets --data "target=192.168.65.190:8867" --data "weight=100"</code>

創(chuàng)建 service 和 route

調(diào)用 Kong Admin API /services 先舷,創(chuàng)建名字為 tulingmall-productservice 烈拒。host 參數(shù)嫂丙,用于設(shè)置對(duì)應(yīng)的 upstream 的名字。

curl -X POST http://127.0.0.1:8001/services --data "name=tulingmall-product" --data "host=tulingmall-product-upstream" --data "path=/pms"

調(diào)用 Kong Admin API services/${service}/routes 惠险,創(chuàng)建一個(gè)請(qǐng)求路徑為 pathroute 撩笆。注意捺球, {service} 路徑參數(shù),為 service 的名字浇衬。

curl -X POST http://localhost:8001/services/tulingmall-product/routes --data "name=tulingmall-product-route" --data "paths[]=/pms"

復(fù)制代碼

測(cè)試

curl http://127.0.0.1:8000/pms/productInfo/42

3.2 kong 限流配置

Kong 提供了 Rate Limiting 插件懒构,實(shí)現(xiàn)對(duì)請(qǐng)求的 限流 功能,避免過(guò)大的請(qǐng)求量過(guò)大耘擂,將后端服務(wù)打掛胆剧。

Rate Limiting 支持秒/分/小時(shí)/日/月/年多種 時(shí)間維度 的限流,并且可以組合使用醉冤。例如說(shuō):限制每秒最多 100 次請(qǐng)求秩霍,并且每分鐘最多 1000 次請(qǐng)求。

Rate Limiting 支持 consumer 蚁阳、 credential 铃绒、 ip 三種 基礎(chǔ)維度 的限流,默認(rèn)為 consumer 螺捐。例如說(shuō):設(shè)置每個(gè) IP 允許每秒請(qǐng)求的次數(shù)颠悬。計(jì)數(shù)的存儲(chǔ),支持使用 local 定血、 cluster 赔癌、 redis 三種方式進(jìn)行存儲(chǔ),默認(rèn)為 cluster

  • local :存儲(chǔ)在 Nginx 本地澜沟,實(shí)現(xiàn)單實(shí)例限流灾票。

  • cluster :存儲(chǔ)在 Cassandra 或 PostgreSQL 數(shù)據(jù)庫(kù),實(shí)現(xiàn)集群限流茫虽。

  • redis :存儲(chǔ)在 Redis 數(shù)據(jù)庫(kù)刊苍,實(shí)現(xiàn)集群限流。

Rate Limiting 采用的限流算法是 計(jì)數(shù)器 的方式濒析,所以無(wú)法提供類似令牌桶算法的平滑限流能力正什。

配置 Rate Limiting 插件

調(diào)用 Kong Admin API services/${service}/plugins ,創(chuàng)建 Rate Limiting 插件的配置:

# 服務(wù)上啟用插件
  • name 參數(shù)号杏,設(shè)置為 rate-limiting 表示使用 Rate Limiting 插件埠忘。

  • config.second 參數(shù),設(shè)置為 1 表示每秒允許 1 次請(qǐng)求。

  • config.limit_by 參數(shù)莹妒,設(shè)置為 ip 表示使用 IP 基礎(chǔ)維度的限流名船。

    也可以通過(guò) konga UI 操作添加 rate-limiting 插件

測(cè)試

請(qǐng)求超過(guò)閾值,會(huì)被 kong 限流

3.3 Basic Auth 身份認(rèn)證

配置 Basic Auth 插件

# 在服務(wù)上配置插件

通過(guò) konga UI 為路由添加 basic-auth 插件

創(chuàng)建用戶并添加 Basic 憑證

測(cè)試

3.4 JWT 身份認(rèn)證

配置 JWT 插件

調(diào)用 Kong Admin API services/${service}/plugins 旨怠,創(chuàng)建 JWT 插件的配置:

<code data-type="codeline">curl -X POST http://127.0.0.1:8001/services/tulingmall-product/plugins \</code><code data-type="codeline">    --data "name=jwt"</code>
  • name 參數(shù)渠驼,設(shè)置為 jwt 表示使用 JWT 插件。
# 查看插件列表

復(fù)制代碼

通過(guò) konga UI 操作添加 jwt 插件

測(cè)試

請(qǐng)求被 kong 安全攔截

創(chuàng)建 Consumer

調(diào)用 Kong Admin API consumers 鉴腻,創(chuàng)建一個(gè) Consumer 消費(fèi)者:

<code data-type="codeline">$ curl -i -X POST http://localhost:8001/consumers/ \</code><code data-type="codeline">    --data "username=fox"</code>

創(chuàng)建 consumer 的 jwt 憑證

調(diào)用 Kong Admin API consumers/{username}/{plugin} 迷扇, 生成 該消費(fèi)者的 JWT 信息:

  • {username} 路徑參數(shù),為 Consumer 的用戶名爽哎。

  • {plugin} 路徑參數(shù)蜓席,為 Plugin 的插件名。

可以指定算法 algorithm 课锌, iss 簽發(fā)者 key 厨内,密鑰 secret ,也可以省略渺贤,會(huì)自動(dòng)生成雏胃。

<code data-type="codeline">$ curl -i -X POST http://localhost:8001/consumers/fox/jwt/ \</code><code data-type="codeline">-d "algorithm=HS256" \</code><code data-type="codeline">-d "key=fox123" \</code><code data-type="codeline">-d "secret=uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u"</code>

復(fù)制代碼

<code data-type="codeline">{</code><code data-type="codeline">    "rsa_public_key":null,</code><code data-type="codeline">    "algorithm":"HS256",</code><code data-type="codeline">    "id":"3dc4d177-8a7a-4edc-bc88-ee7aa2447fc7",</code><code data-type="codeline">    "tags":null,</code><code data-type="codeline">    "consumer":{</code><code data-type="codeline">        "id":"8e7fb82d-68ef-4f2b-a30c-613866378525"</code><code data-type="codeline">    },</code><code data-type="codeline">    "secret":"uFLMFeKPPL525ppKrqmUiT2rlvkpLc9u",</code><code data-type="codeline">    "created_at":1625803149,</code><code data-type="codeline">    "key":"fox123"</code><code data-type="codeline">}</code>

復(fù)制代碼

查看 fox 的 jwt 憑證

curl -X GET localhost:8001/consumers/fox/jwt

復(fù)制代碼

image

生成 jwt token

業(yè)務(wù)服務(wù)器根據(jù) kong 生成的 jwt 憑證中的 algorithm、key(iss)志鞍、secret 進(jìn)行 token 的演算和下發(fā)瞭亮。請(qǐng)求 鑒權(quán)接口 需攜帶 Authorization: Bearer jwt 進(jìn)行請(qǐng)求。測(cè)試可以在 https://jwt.io/ 中通過(guò) Debugger 生成 jwt token

獲取到 jwt token 令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8

復(fù)制代碼

測(cè)試

<code data-type="codeline">curl http://192.168.65.200:8000/pms/productInfo/42 \</code><code data-type="codeline">    -H "Authorization: Bearer  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJpc3MiOiJmb3gxMjMifQ.hqHGVujYheALxXpEVtgisA5pPTGfQYet0IKadnYPtj8"</code>

復(fù)制代碼

3.5 黑白名單配置

配置插件

# 在服務(wù)上啟用插件

復(fù)制代碼

  • config.whitelist :白名單固棚,逗號(hào)分隔的 IPs 或 CIDR 范圍统翩。

  • config.blacklist :白名單,逗號(hào)分隔的 IPs 或 CIDR 范圍此洲。

<code data-type="codeline">curl -X POST http://127.0.0.1:8001/routes/ad515a07-bae4-4b54-a927-35bc6c85565b/plugins \</code><code data-type="codeline">    --data "name=ip-restriction"  \</code><code data-type="codeline">    --data "config.whitelist=192.168.65.200"</code>

復(fù)制代碼

測(cè)試

當(dāng)前本機(jī)器 IP 地址為: 192.168.65.103

將本機(jī) ip 加入到白名單

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厂汗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子黍翎,更是在濱河造成了極大的恐慌,老刑警劉巖艳丛,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣掸,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氮双,警方通過(guò)查閱死者的電腦和手機(jī)碰酝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)戴差,“玉大人送爸,你說(shuō)我怎么就攤上這事。” “怎么了袭厂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵墨吓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纹磺,道長(zhǎng)帖烘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任橄杨,我火速辦了婚禮秘症,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘式矫。我一直安慰自己乡摹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布采转。 她就那樣靜靜地躺著聪廉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪氏义。 梳的紋絲不亂的頭發(fā)上锄列,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音惯悠,去河邊找鬼邻邮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛克婶,可吹牛的內(nèi)容都是我干的筒严。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼情萤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鸭蛙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起筋岛,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娶视,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后睁宰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肪获,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年柒傻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孝赫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡红符,死狀恐怖青柄,靈堂內(nèi)的尸體忽然破棺而出伐债,到底是詐尸還是另有隱情,我是刑警寧澤致开,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布峰锁,位于F島的核電站,受9級(jí)特大地震影響喇喉,放射性物質(zhì)發(fā)生泄漏祖今。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一拣技、第九天 我趴在偏房一處隱蔽的房頂上張望千诬。 院中可真熱鬧,春花似錦膏斤、人聲如沸徐绑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)傲茄。三九已至,卻和暖如春沮榜,著一層夾襖步出監(jiān)牢的瞬間盘榨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工蟆融, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留草巡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓型酥,卻偏偏與公主長(zhǎng)得像山憨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弥喉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容