apisix~authz-keycloak插件介紹
參考:
kc插件源碼梳理及原理說明
如果只是進行(xing)keycloak頒發的token進行(xing)校(xiao)驗(簽名校(xiao)驗和有效期校(xiao)驗),那么我(wo)們(men)可以使用jwt-auth這(zhe)個(ge)插(cha)件(jian)實現,并且已(yi)經對這(zhe)個(ge)插(cha)件(jian)進行(xing)二次開發,支持jwt內容解析與向(xiang)下請求頭的傳遞。
作用
主要用到keycloak提供的uma遠程資源授權上面,它對于直接在keycloak后臺配置上游服務的資源權限keycloak~資源的遠程授權uma,進行代理,不需要上游(you)服(fu)務再去直(zhi)接對接keycloak。
原理
在lua插件中,實(shi)現了與(yu) keycloak服務(wu)端(duan)的(de)通(tong)訊(xun),你(ni)可(ke)以把(ba)這個插件當成是keycloak的(de)一個客戶(hu)端(duan)代理,這個客戶(hu)端(duan)是在keycloak上提前注冊的(de),它(ta)對應一個或者多個應用,應用下面有很(hen)多api資(zi)源(yuan),這些資(zi)源(yuan)可(ke)以通(tong)過keycloak的(de)uma進(jin)行管理。
插件配置參考
{
"client_id": "pkulaw",
"client_secret": "c0b7ab8e-485b-4a10-bff8-7c7d3f472096",
"discovery": "//testcas.xxx.com/auth/realms/xx/.well-known/openid-configuration",
"permissions": [
"Default Resource"
],
"realm": "fabao",
"ssl_verify": false,
"token_endpoint": "//testcas.xxx.com/auth/realms/xx/protocol/openid-connect/token"
}
- client_id kc上的客戶端ID
- client_secret 客戶端的密鑰,本插件不支持public類型的客戶端
- discovery kc的開發接口地址,包含認證地址,登出地址,刷新token地址,公鑰地址等
- permissions 一組資源,提前在kc的pkulaw這個客戶端上建立的資源,它是一組路由地址
- realm kc上對應的域,相當于租戶,它下面的組,用戶,客戶端,角色都是隔離的
- ssl_verify 是否開啟ssl證書驗證,如果是自簽名請關閉本項
- token_endpoint kc的認證的地址
插件源碼功能點
- 獲取header中的Authorization
- 判斷是否需要密碼認證方式,如果需要會向kc發起登錄請求
- 獲取jwt_token,從Authorization中截取Bearer 后面的部分
- 如果沒有傳token,直接返回401
- 解析kc中這個客戶端的資源列表,如果配置的資源不存在,直接400
- 驗證token的有效性,這塊為在線校驗,token無效或者登錄出,返回401
- 評估對配置的permisssion資源是否有權限,如無權限,返回403
- token中包含了資源所需權限,方可正常訪問