1. Apache APISIX介紹
Apache APISIX 是 Apache 軟件基金會下的云原生 API 網(wǎng)關(guān),它兼具動態(tài)、實(shí)時、高性能等特點(diǎn),提供了負(fù)載均衡、動態(tài)上游、灰度發(fā)布(金絲雀發(fā)布)、服務(wù)熔斷、身份認(rèn)證、可觀測性等豐富的流量管理功能。我們可以使用 Apache APISIX 來處理傳統(tǒng)的南北向流量,也可以處理服務(wù)間的東西向流量。同時,它也支持作為 K8s Ingress Controller 來使用。
1.1. 特色優(yōu)勢
n 多平臺支持:APISIX 提供了多平臺解決方案,它不但支持裸機(jī)運(yùn)行,也支持在 Kubernetes 中使用,還支持與 AWS Lambda、Azure Function、Lua 函數(shù)和 Apache OpenWhisk 等云服務(wù)集成。
n 全動態(tài)能力:APISIX 支持熱加載,這意味著你不需要重啟服務(wù)就可以更新 APISIX 的配置。請?jiān)L問為什么 Apache APISIX 選擇 Nginx + Lua 這個技術(shù)棧?以了解實(shí)現(xiàn)原理。
n 精細(xì)化路由:APISIX 支持使用 NGINX 內(nèi)置變量做為路由的匹配條件,你可以自定義匹配函數(shù)來過濾請求,匹配路由。
n 運(yùn)維友好:APISIX 支持與以下工具和平臺集成:HashiCorp Vault、Zipkin、Apache SkyWalking、Consul、Nacos、Eureka。通過 APISIX Dashboard,運(yùn)維人員可以通過友好且直觀的 UI 配置 APISIX。
n 多語言插件支持:APISIX 支持多種開發(fā)語言進(jìn)行插件開發(fā),開發(fā)人員可以選擇擅長語言的 SDK 開發(fā)自定義插件。
官方網(wǎng)站地址:https://apisix.apache.org/
2. MaxKey介紹
Dromara MaxKey社區(qū)以“安全連接、傳遞信任”為宗旨,專注于身份安全管理(IM)、單點(diǎn)登錄(SSO)和云身份認(rèn)證(IDaas)領(lǐng)域,將為客戶提供企業(yè)級的身份管理和認(rèn)證,提供全面的4A安全管理(指Account,Authentication,Authorization和Audit)。
為企業(yè)提供社區(qū)版IAM產(chǎn)品,減少企業(yè)建設(shè)IAM的成本;同時提供企業(yè)版的IAM咨詢和技術(shù)支持,從而提高客戶體驗(yàn)和降低企業(yè)內(nèi)部的自開發(fā)成本。
MaxKey單點(diǎn)登錄認(rèn)證系統(tǒng),諧音為馬克思的鑰匙寓意是最大鑰匙,是業(yè)界領(lǐng)先的IAM-IDaas身份管理和認(rèn)證產(chǎn)品;支持OAuth 2.x/OpenID Connect、SAML 2.0、JWT、CAS、SCIM等標(biāo)準(zhǔn)協(xié)議;提供標(biāo)準(zhǔn)、安全和開放的用戶身份管理(IDM)、身份認(rèn)證(AM)、單點(diǎn)登錄(SSO)、資源管理和權(quán)限管理等;開源、安全、自主可控。
官方網(wǎng)站地址:https://www.maxkey.top/
3. MaxKey安裝配置
安裝的版本為v3.5.X,請參照官方安裝文檔
https://www.maxkey.top/zh/conf/tutorial.html
3.1. 登錄管理控制臺
登錄到MaxKey后臺管理
3.2. 應(yīng)用配置
進(jìn)入后臺“應(yīng)用管理”,編輯應(yīng)用
配置主要明細(xì)入下
配置對應(yīng)關(guān)系
序號 |
MaxKey |
參數(shù) |
備注 |
---|---|---|---|
1 |
登錄地址 |
http://192.168.0.105:9080/protectweb |
|
2 |
訪問協(xié)議 |
OAuth2.0 |
|
3 |
回調(diào)地址 |
http://192.168.0.105:9080/protectweb/callback |
|
4 |
授權(quán)方式 |
authorization_code password ?client_credentials |
|
5 |
適配 |
啟用 |
適配 |
6 |
適配器 |
OAuth2.0默認(rèn)適配器 |
適配器 |
3.3. 應(yīng)用訪問賦權(quán)
如果不在該列表內(nèi),可以“新增成員”
4. APISIX安裝配置
安裝的版本為v3.1,請參照官方安裝文檔
https://apisix.apache.org/zh/docs/apisix/installation-guide/
5. 場景示例?
開源的 API 網(wǎng)關(guān) Apache APISIX 支持使用 openid-connect 插件對接以上身份認(rèn)證服務(wù),APISIX 會將所有未認(rèn)證的請求重定向至身份認(rèn)證服務(wù)的登錄頁,當(dāng)?shù)卿洺晒?APISIX 會將獲取到的用戶信息發(fā)送至上游服務(wù)。
下圖為 OpenID Connect 協(xié)議交互流程:
在重定向階段(Redirect),IdP 將用戶重定向到一個預(yù)先配置好的重定向 URL(redirect_url),例如 http://192.168.0.105:9080/protectweb/callback。請注意:這是一個在 APISIX 中不存在的 API,它只用于捕獲相關(guān)的請求,并在 OIDC 邏輯中完成 Token 交換的功能。請不要使用這個地址作為觸發(fā) OIDC 插件重定向的條件,否則,它將返回如下錯誤:the error request to the redirect_uri path, but there's no session state found。
5.1. 相關(guān)術(shù)語?
1. Bearer Only: MaxKey支持賬戶密碼或 AccessToken 進(jìn)行身份認(rèn)證,若啟用 bearer_only 選項(xiàng),則僅允許通過 AccessToken 進(jìn)行認(rèn)證,該方式適用于服務(wù)之間的訪問認(rèn)證;
2. Inst: MaxKey中的 Inst相當(dāng)于一個租戶,不同 Inst 是相互隔離的,只能管理和驗(yàn)證它們所具有的用戶;
3. Scope:這是一種限制在訪問令牌(AccessToken)中聲明的角色的方法。例如,當(dāng)一個客戶端要求驗(yàn)證一個用戶時,客戶端收到的訪問令牌將只包含范圍明確指定的角色映射??蛻舳朔秶试S你限制每個單獨(dú)的訪問令牌的權(quán)限,而不是讓客戶端訪問用戶的所有權(quán)限;
4. User:User 是可以登錄到 MaxKey的用戶,可以思考下你所用過的 SSO 登錄服務(wù);
5. Client:客戶端是指想要使用 MaxKey來保護(hù)的服務(wù)。
5.2. 前置條件?
本示例使用 APISIX的默認(rèn)服務(wù) 作為上游服務(wù),它將返回請求中的所有內(nèi)容。
5.3. 場景一:使用賬戶密碼保護(hù)上游服務(wù)?
本示例將引導(dǎo)客戶端到登陸頁通過賬戶密碼的方式進(jìn)行身份認(rèn)證:
5.3.1. 創(chuàng)建一條路由
APISIX登錄
路由創(chuàng)建,配置如下
{
"_meta": {
"disable": false
},
"bearer_only": false,
"client_id": "ae20330a-ef0b-4dad-9f10-d5e3485ca2ad",
"client_secret": "KQY4MDUwNjIwMjAxNTE3NTM1OTEYty",
"discovery": "http://192.168.0.104/sign/authz/oauth/v20/1/.well-known/openid-configuration?client_id=ae20330a-ef0b-4dad-9f10-d5e3485ca2ad",
"introspection_endpoint": "",
"introspection_endpoint_auth_method": "",
"logout_path": "/protectapi/logout",
"realm": "1",
"redirect_uri": "http://192.168.0.105:9080/protectweb/callback"
}
復(fù)制
5.3.2. 訪問未授權(quán)地址
訪問 http://192.168.0.105:9080/protectweb/ 時,由于未進(jìn)行登錄,因此將被引導(dǎo)到 MaxKey 的登錄頁面:
5.3.3. 授權(quán)應(yīng)用訪問
1、輸入賬號(admin)、密碼(maxkey)完成登錄后
2、成功跳轉(zhuǎn)到 http://192.168.0.105:9080/protectweb/ 頁面:
5.4. 場景二:使用 AccessToken 驗(yàn)證身份
通過啟用 bearer_only 參數(shù)對應(yīng)用之間的調(diào)用進(jìn)行身份認(rèn)證,此時應(yīng)用訪問 APISIX 時需攜帶 Authorization Header,否則該請求將被拒絕。
5.4.1. 創(chuàng)建一條路由
{
"_meta": {
"disable": false
},
"bearer_only": true,
"client_id": "ae20330a-ef0b-4dad-9f10-d5e3485ca2ad",
"client_secret": "KQY4MDUwNjIwMjAxNTE3NTM1OTEYty",
"discovery": "http://192.168.0.104/sign/authz/oauth/v20/1/.well-known/openid-configuration",
"introspection_endpoint": "http://192.168.0.104/sign/authz/oauth/v20/introspect",
"introspection_endpoint_auth_methods_supported": [
"client_secret_basic"
],
"logout_path": "/protectweb/logout",
"realm": "1",
"redirect_uri": "http://192.168.0.105:9080/protectweb/callback"
}
復(fù)制
5.4.2. 訪問未授權(quán)地址
未攜帶 X-Access-Token 訪問 Apache APISIX 時將返回 401 表明未經(jīng)授權(quán):
curl -X GET -i 'http://192.168.0.105:9080/protectapi/'
5.4.3. 調(diào)用 MaxKey API 獲取 AccessToken:
對應(yīng)命令入下
curl -X GET -i 'http://192.168.0.104/sign/authz/oauth/v20/token?grant_type=password&username=admin&client_id=ae20330a-ef0b-4dad-9f10-d5e3485ca2ad&client_secret=KQY4MDUwNjIwMjAxNTE3NTM1OTEYty&password=maxkey'
復(fù)制
5.4.4. 攜帶AccessToken訪問
將 AccessToken 放于 Authorization 頭中請求 APISIX(替換掉 ${AccessToken}),可以認(rèn)證成功:
對應(yīng)命令入下
curl -X GET -H 'Authorization: Bearer 87d24b21-b9a5-472e-a405-e2ead4d1bb9f' -i 'http://192.168.0.105:9080/protectapi/'
復(fù)制
5.5. 場景三:上游服務(wù)解析 UserInfo 信息?
當(dāng)啟用 APISIX set_userinfo_header 配置后,認(rèn)證成功后回調(diào)請求將攜帶 X-Userinfo 請求頭,它包含了 User 的基本信息,可通過 base64_decode 獲得用戶內(nèi)容。
6. 常見問題
6.1. 為什么 APISIX 中 Cookie 值非常長?
因?yàn)?APISIX 會將 id_token、access_token、refresh_token 等值寫入 Cookie 中,因此整個 Cookie 內(nèi)容比較長。具體實(shí)現(xiàn)可閱讀 lua-resty-openidc 庫中設(shè)置 session 的邏輯。
6.2. 如何修改 Session 存儲的 Cookie 名稱、存儲位置?
目前 openid-connect 插件未提供自定義這部分配置的能力,因此可以使用 lua-resty-session 中提供的方法:通過 NGINX 變量的方式對其默認(rèn)配置進(jìn)行覆蓋。 此處借助 APISIX 提供的 NGINX 配置注入能力以實(shí)現(xiàn)覆蓋:通過在配置文件 {apisix}/conf/config.yaml 中添加這些代碼,可修改 Session 存儲 Cookie 的名稱:文章來源:http://www.zghlxwxcb.cn/news/detail-462517.html
nginx_config: http_server_configuration_snippet: | set $session_name "session_override";文章來源地址http://www.zghlxwxcb.cn/news/detail-462517.html
到了這里,關(guān)于使用開源 MaxKey 與 APISIX 網(wǎng)關(guān)保護(hù)你的 API的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!