您可以通過本插件配置自己的鑒權服務為API的訪問進行鑒權。
1. 概述
API網關在調用API后端服務之前將先調用用戶的鑒權服務,收到鑒權服務的鑒權成功應答后才會繼續調用后端服務,否則給客戶端返回鑒權失敗的應答。第三方鑒權插件支持的功能如下:
允許用戶自定義發送給鑒權服務的請求參數;
允許用戶將鑒權應答結果在API網關緩存一定時間,保持業務的平滑度;
允許用戶自定義鑒權失敗的應答;
2. 插件配置
2023-05-09號之前購買的專享實例,如果不生效需提交工單聯系我們給您升級實例版本。
2.1 當鑒權服務為公網地址時,插件配置示例如下:
---
parameters: # 鑒權結果表達式中使用到的參數定義
statusCode: "StatusCode" # http應答碼
authUriType: "HTTP" # 鑒權服務類型:HTTP:公網的鑒權地址,HTTP-VPC:VPC授權地址
authUri: # 鑒權服務定義
address: "http://auth.com:8080" # 鑒權服務地址,包括端口號
path: "/auth" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,最大為10秒
method: POST # 鑒權服務HTTP Method
passThroughBody: false # 是否將請求的body透傳給鑒權服務
passThroughPath: true # 如果為true,請求path將放到X-Ca-Remote-Auth-Raw-Path頭中發送給鑒權服務
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
trimAuthorizationHeaderPrefix: true # 如果鑒權參數位置在Authorization頭中,智能跳過前綴提取參數內容,比如從Authorization:bearer hello這個頭提取出來的值是hello,而不是bearer hello
authParameters: # 發送給鑒權服務的參數映射
- targetParameterName: x-userId # 發送給鑒權服務的參數名稱
sourceParameterName: userId # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
- targetParameterName: x-password # 發送給鑒權服務的參數名稱
sourceParameterName: password # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
- targetParameterName: token
sourceParameterName: Authorization
targetLocation: query
sourceLocation: header
successCondition: "${statusCode} = 200" # 判斷鑒權應答的表達式,表達式為True表示鑒權成功
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode : 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的body透傳給客戶端
ignoreAuthException: true # 如果鑒權發生Exception,比如超時,連接出錯,忽略鑒權結果,直接訪問后端
綁定了此插件的API,API網關在處理相關請求的時候,會先根據定義組裝一個鑒權請求發送給“http://auth.com:8080”,并且根據應答判斷鑒權是否通過。如果鑒權沒有通過,可以定制鑒權失敗的應答返回給客戶端。
2.2 當鑒權服務在VPC資源內時,需先給鑒權服務創建VPC授權,插件配置示例如下:
---
parameters: # 鑒權結果表達式中使用到的參數定義
statusCode: "StatusCode" # http應答碼
authUriType: "HTTP-VPC" # 鑒權服務類型:HTTP為公網的鑒權地址,HTTP-VPC為VPC授權地址
authUri: # 鑒權服務定義
vpcAccessName: "slbAccessForVip" # 鑒權服務的VPC授權名稱
path: "/auth" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,最大為10秒
method: POST # 鑒權服務HTTP Method
passThroughBody: false # 是否將請求的body透傳給鑒權服務
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
authParameters: # 發送給鑒權服務的參數映射
- targetParameterName: x-userId # 發送給鑒權服務的參數名稱
sourceParameterName: userId # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
- targetParameterName: x-password # 發送給鑒權服務的參數名稱
sourceParameterName: password # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
successCondition: "${statusCode} = 200" # 判斷鑒權應答的表達式,表達式為True表示鑒權成功
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode : 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的body透傳給客戶端
ignoreAuthException: true # 如果鑒權發生Exception,比如超時,連接出錯,忽略鑒權結果,直接訪問后端
2.3 支持提取鑒權結果Body中的JSON中的字段作為表達式的參數
---
parameters: # 鑒權結果表達式中使用到的參數定義
clientId: "BodyJsonField:$.clientId"# 鑒權應答BODY中的JSON結構中的參數名為clientId
authUriType: "HTTP-VPC" # 鑒權服務類型:HTTP:公網的鑒權地址,HTTP-VPC:VPC授權地址
authUri: # 鑒權服務定義
vpcAccessName: "slbAccessForVip" # 鑒權服務的VPC授權名稱
vpcScheme: "https" # 鑒權服務協議指定HTTPS,不指定默認是HTTP
path: "/auth" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,最大為10秒
method: POST # 鑒權服務HTTP Method
passThroughBody: false # 是否將請求的body透傳給鑒權服務
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
authParameters: # 發送給鑒權服務的參數映射
- targetParameterName: x-userId # 發送給鑒權服務的參數名稱
sourceParameterName: userId # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
- targetParameterName: x-password # 發送給鑒權服務的參數名稱
sourceParameterName: password # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
successCondition: "${clientId} = 10086" # 判斷鑒權應答的表達式,表達式為True表示鑒權成功
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode : 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的ody透傳給客戶端
ignoreAuthException: true # 如果鑒權發生Exception,比如超時,連接出錯,忽略鑒權結果,直接訪問后端
如果鑒權服務返回的應答中的clientId字段為10086,那么鑒權就成功。
{"code":200,"clientId":10086}
2.4 支持提取鑒權結果與插件數據集進行身份鑒權,實現動態白名單
用戶通過插件數據集保存一份白名單數據,API網關從第三方鑒權結果的應答中提取用戶身份字段,并且驗證用戶身份是否在白名單中,只有白名單中用戶才能通過鑒權。
---
parameters: # 鑒權結果表達式中使用到的參數定義
statusCode: "StatusCode" # http應答碼
clientId: "BodyJsonField:$.clientId"# 鑒權應答BODY中的JSON結構中的參數名為clientId
authUriType: "HTTP-VPC" # 鑒權服務類型:HTTP:公網的鑒權地址,HTTP-VPC:VPC授權地址
authUri: # 鑒權服務定義
vpcAccessName: "slbAccessForVip" # 鑒權服務的VPC授權名稱
path: "/auth" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,最大為10秒
method: POST # 鑒權服務HTTP Method
passThroughBody: false # 是否將請求的body透傳給鑒權服務
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
authParameters: # 發送給鑒權服務的參數映射
- targetParameterName: x-userId # 發送給鑒權服務的參數名稱
sourceParameterName: userId # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
- targetParameterName: x-password # 發送給鑒權服務的參數名稱
sourceParameterName: password # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
successCondition: "${statusCode} = 200" # 判斷鑒權應答的表達式
accessParameterName: clientId # 參與數據集內數據進行比對的參數名稱
accessByDataSet: dataset_test # 參與鑒權的數據集,如果數據集內數據包含了clientId的值,那么鑒權就通過
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode : 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的body透傳給客戶端
ignoreAuthException: true # 如果鑒權發生Exception,比如超時,連接出錯,忽略鑒權結果,直接訪問后端
如果鑒權服務返回的應答中的clientId字段值在名稱為dataset_test的插件數據集中存在,那么鑒權就成功。
2.5 支持與APP驗證融合
---
parameters: # 鑒權結果表達式中使用到的參數定義
statusCode: "StatusCode" # http應答碼
authUriType: "HTTP-VPC" # 鑒權服務類型:HTTP:公網的鑒權地址,HTTP-VPC:VPC授權地址
authUri: # 鑒權服務定義
vpcAccessName: "slbAccessForVip" # 鑒權服務的VPC授權名稱
path: "/auth" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,最大為10秒
method: POST # 鑒權服務HTTP Method
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
authParameters: # 發送給鑒權服務的參數映射
- targetParameterName: x-password # 發送給鑒權服務的參數名稱
sourceParameterName: password # 對應的原始請求中的參數名稱
targetLocation: query # 發送給鑒權服務的參數位置
sourceLocation: query # 對應的原始請求中的參數位置
successCondition: "${statusCode} = 200" # 判斷鑒權應答的表達式
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode : 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的ody透傳給客戶端
ignoreAuthException: true # 如果鑒權發生Exception,比如超時,連接出錯,忽略鑒權結果,直接訪問后端
orAppAuth: true # APP驗證和第三方鑒權只要有一個成功了,就算鑒權成功
配置了orAppAuth: true參數后,APP驗證和第三方鑒權只要有一個成功了,就算鑒權成功。
2.6 支持從鑒權服務的應答中提取字段發給后端服務
從鑒權服務返回的應答中提取字段發給后端服務,可以用authResultPassThrough
來配置發送給后端服務的參數映射。
應答提取支持的參數位置:StatusCode、Header、JsonBody。
后端服務支持的參數位置:Header、Query、Formdata。
---
parameters: # 鑒權結果表達式中使用到的參數定義
statusCode: "StatusCode" # http應答碼
clientId: "BodyJsonField:$.Body" # 鑒權服務返回的jsonbody
authUriType: "HTTP" # 鑒權服務類型:HTTP:公網的鑒權地址,HTTP-VPC:VPC授權地址
authUri: # 鑒權服務定義
address: "http://127.0.0.1:8080" # 鑒權服務地址,包括端口號
path: "/web" # 鑒權服務路徑
timeout: 7000 # 鑒權服務超時時間,單位是ms。最大支持10s
method: POST # 鑒權服務HTTP Method
passThroughBody: true # 是否將請求的body透傳給鑒權服務
cachedTimeBySecond: 10 # API網關緩存鑒權結果應答的時間,最長為10分鐘(目前緩存是將所有apiuid+authparameters作為主鍵去緩存的)
authResultPassThrough: #發送給后端服務的參數映射
- targetParameterName: x-echo-header-client-id #發送給后端服務的參數名稱
targetLocation: header #發送給后端服務的參數位置
sourceParameterName: clientId #從鑒權服務應答中提取的參數
- targetParameterName: x-echo-header-status-code
targetLocation: query
sourceParameterName: statusCode
successCondition: "${statusCode} = 200" # 判斷鑒權應答的表達式
errorMessage: "auth failed" # 鑒權失敗時,客戶端收到的應答x-ca-errormessage頭的值
errorStatusCode: 401 # 鑒權失敗時,客戶端收到的http status值
errorPassThroughHeaderList: auth-result1,auth-result2 # 鑒權失敗時,透傳鑒權應答的指定頭給客戶端
errorPassThroughBody: true # 鑒權失敗時,將鑒權應答的ody透傳給客戶端
2.7 支持緩存鑒權應答
API網關為提高業務處理的平滑度,減少用戶鑒權服務的壓力,支持緩存鑒權應答,目前緩存是將apiuid + 所有authparameters 拼接成主鍵,鑒權應答作為緩存的值進行緩存的。緩存鑒權應答的時間最長為10分鐘。
3. 日志
在投遞給sls的日志中,有一個plugin字段,里面描述了第三方鑒權的結果,"authSuccess":"0"為鑒權失敗,"authSuccess":"1"為鑒權成功。
plugin:[{"context":{"authSuccess":"0"},"pluginName":"remoteAuth"}]