云原生網關支持為路由配置認證,并對指定的消費者進行鑒權,以允許對應消費者訪問路由。本文介紹如何配置消費者鑒權。
背景信息
相比全局認證鑒權適用于統一登錄認證等ToC場景,路由認證和消費者鑒權模式適用于授權API給合作伙伴等ToB場景。
對比項 | 全局認證鑒權 | 路由認證+消費者鑒權 |
適用場景 | 統一登錄認證等ToC場景。 | 授權API給合作伙伴等ToB場景。 |
核心差異 | 開啟認證的同時也開啟鑒權。 | 開啟認證后,需要額外做鑒權配置。 |
配置入口 | 安全管理 > 全局認證鑒權。 |
|
認證方式配置(以JWT認證為例) |
|
|
鑒權方式配置 | 創建配置時填寫黑名單或白名單的域名和路徑(Path)列表。
|
|
創建消費者
登錄MSE網關管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄選擇云原生網關 > 網關列表。
在網關列表頁面,單擊目標網關名稱。
在左側導航欄,單擊安全管理 > 消費者鑒權。
單擊創建消費者按鈕。
配置相關參數,然后單擊確定。
配置參數說明如下。
配置項
描述
消費者名稱
自定義消費者的名稱。
消費者說明
對消費者進行描述。
認證方式
當前消費者支持的認證方式。
密鑰類型
對稱密鑰:生成一份默認的JWKS配置(每個消費者不同),包含加密或者解密Token時使用的密鑰。
非對稱密鑰:需要您自己填寫完整的JWKS配置,使用私鑰加密Token。網關根據JWKS中配置的公鑰進行解密。
JWKS
設置JWKS配置,JWKS規范說明請參考JSON Web Key (JWK)。
JWT Token配置
設置JWT Token配置信息。
類型:Token參數類型。默認Header。
Key:Token參數名稱。
前綴:Token參數名的前綴。設置需要校驗的Token參數信息,默認是以Bearer為前綴放在Authorization Header中,例如:Authorization: Bearer token。
是否透傳:選中Token參數透傳,表示透傳此Token參數到后端服務。
JWT Payload 內消費者標識
指定從JWT Payload中的Key以及對應Value來識別為當前消費者。默認提供一對標識,Key為uid,Value為隨機字符串,可以自行修改。
以上圖配置為例,JWT Token中的Payload應為如下所示:
{ "uid": "11215ac069234abcb8944232b79ae711" }
Token生成方式
本文應用Java示例說明,其他語言用戶也可以找到相關的工具生成密鑰對。
新建一個Maven項目,注入如下依賴:
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
<version>0.7.0</version>
</dependency>
使用默認對稱密鑰示例生成Token
package org.example;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;
import org.jose4j.base64url.Base64;
import org.jose4j.json.JsonUtil;
import org.jose4j.jwk.OctJwkGenerator;
import org.jose4j.jwk.OctetSequenceJsonWebKey;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
import org.jose4j.keys.HmacKey;
import org.jose4j.lang.JoseException;
import sun.lwawt.macosx.CSystemTray;
public class Main {
public static void main(String[] args) throws JoseException, UnsupportedEncodingException {
//使用本文上述示例
String privateKeyJson = "{\n"
+ " \"k\": \"VoBG-oyqVoyCr9G56ozmq8n_rlDDyYMQOd_DO4GOkEY\",\n"
+ " \"kty\": \"oct\",\n"
+ " \"alg\": \"HS256\",\n"
+ "}";
JwtClaims claims = new JwtClaims();
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
//設置過期時間,并且小于7天
NumericDate date = NumericDate.now();
date.addSeconds(120*60);
claims.setExpirationTime(date);
claims.setNotBeforeMinutesInThePast(1);
//添加自定義參數,所有值請都使用String類型
//設置消費者標識
claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
JsonWebSignature jws = new JsonWebSignature();
//設置加密算法
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
jws.setPayload(claims.toJson());
String jwtResult = jws.getCompactSerialization();
System.out.println("Generate Json Web token , result is \n " + jwtResult);
}
}
代碼相關設置說明。
privateKeyJson
:即在創建消費者時使用的JWKS,可以在創建消費者時記錄下自己使用的JWKS,也可以在創建消費者后,在消費者基礎配置頁獲取JWKS。設置消費者標識。即
claims.setClaim("uid", "11215ac069234abcb8944232b79ae711")
,該消費者標識為創建消費者時控制臺默認生成,也可以根據自身邏輯進行修改。您也可以在創建消費者后,在消費者基礎配置頁獲取消費者標識。
設置加密算法。即
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256)
,該加密算法要和JWKS保持一致。說明目前支持的加密算法有ES256、ES384、ES512、RS256、RS384、RS512、PS256、PS384、PS512、HS256、HS384、HS512和EdDSA。
使用對稱加密的時候,需要對"k"進行解碼。
jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
設置過期時間。過期時間需要小于7天,超出過期時間后,請重新生成Token,以保證Token的安全性。
... NumericDate date = NumericDate.now(); date.addSeconds(120*60); claims.setExpirationTime(date); claims.setNotBeforeMinutesInThePast(1); ...
根據自身業務需要,可以在JWKS的
PAYLOAD
中添加自定義參數。
使用非對稱密鑰示例生成Token
package org.example;
import java.io.UnsupportedEncodingException;
import java.security.PrivateKey;
import org.jose4j.base64url.Base64;
import org.jose4j.json.JsonUtil;
import org.jose4j.jwk.OctJwkGenerator;
import org.jose4j.jwk.OctetSequenceJsonWebKey;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.NumericDate;
import org.jose4j.keys.HmacKey;
import org.jose4j.lang.JoseException;
import sun.lwawt.macosx.CSystemTray;
public class Main {
public static void main(String[] args) throws JoseException, UnsupportedEncodingException {
//使用本文上述示例
String privateKeyJson = "{\n"
+ " \"k\": \"VoBG-oyqVoyCr9G56ozmq8n_rlDDyYMQOd_DO4GOkEY\",\n"
+ " \"kty\": \"oct\",\n"
+ " \"alg\": \"HS256\",\n"
+ "}";
JwtClaims claims = new JwtClaims();
claims.setGeneratedJwtId();
claims.setIssuedAtToNow();
//設置過期時間,并且小于7天
NumericDate date = NumericDate.now();
date.addSeconds(120*60);
claims.setExpirationTime(date);
claims.setNotBeforeMinutesInThePast(1);
//添加自定義參數,所有值請都使用String類型
//設置消費者標識
claims.setClaim("uid", "11215ac069234abcb8944232b79ae711");
JsonWebSignature jws = new JsonWebSignature();
//設置加密算法
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256);
jws.setKey(new HmacKey(Base64.decode(JsonUtil.parseJson(privateKeyJson).get("k").toString())));
jws.setPayload(claims.toJson());
String jwtResult = jws.getCompactSerialization();
System.out.println("Generate Json Web token , result is \n " + jwtResult);
}
}
代碼相關設置說明。
設置
privateKeyJson
、消費者標識、過期時間,同對稱加密算法。設置加密算法,即
jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256)
。該加密算法和JWKS保持一致。對于非對稱加密算法,要用其私鑰進行加密。
... jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256); PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privateKeyJson)).getPrivateKey(); jws.setKey(privateKey); ...
根據自身業務需要,可以在JWKS的
PAYLOAD
中添加自定義參數。
開啟路由認證
登錄MSE網關管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄選擇云原生網關 > 網關列表。
在網關列表頁面,單擊目標網關名稱。
在左側導航欄,單擊路由管理,然后選擇路由頁簽。
在需要變更的路由規則操作列,單擊策略配置。
在策略配置頁簽,單擊認證。配置完成后,單擊保存。
參數
描述
認證方式
當前路由認證消費者時使用的認證方式。
開啟狀態
開啟后,認證鑒權生效。
授權給消費者
登錄MSE網關管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄選擇云原生網關 > 網關列表。
在網關列表頁面,單擊目標網關名稱。
在左側導航欄,單擊安全管理 > 消費者鑒權。
在需要變更的消費者規則操作列單擊授權。
在消費者授權頁簽,單擊關聯路由,選擇要授權給當前消費者的路由,然后單擊確定。