全部產品
Search
文件中心

Microservices Engine:配置消費者鑒權

更新時間:Aug 01, 2025

雲原生網關支援為路由配置認證,並對指定的消費者進行鑒權,以允許對應消費者訪問路由。本文介紹如何配置消費者鑒權。

背景資訊

相比全域認證鑒權適用於統一登入認證等ToC情境,路由認證和消費者鑒權模式適用於授權API給夥伴等ToB情境。

對比項

全域認證鑒權

路由認證+消費者鑒權

適用情境

統一登入認證等ToC情境。

授權API給夥伴等ToB情境。

核心差異

開啟認證的同時也開啟鑒權。

開啟認證後,需要額外做鑒權配置。

配置入口

安全管理 > 全局认证鉴权

  1. 路由管理 > 策略配置 > 认证

  2. 安全管理 > 消费者鉴权

認證方式配置(以JWT認證為例)

  1. 建立配置時填寫全域的JWKS配置。

  2. 填寫issuesub欄位作為識別JWT是否合法的依據。

  1. 建立消費者配置時填寫該消費者對應的JWKS配置。

  2. 填寫消費者標識用於識別JWT是否為對應的消費者。預設為payload中的uid欄位,可以自訂。

鑒權方式配置

建立配置時填寫黑名單或白名單的域名路径(Path)列表。

  • 黑名单模式:名單中的域名路径(Path)需要進行認證,其餘無需認證可直接存取。

  • 白名单模式:名單中的域名路径(Path)不需要認證即可訪問,其餘需要進行認證。

  1. 在路由策略配置中為路由開啟认证

  2. 消费者鉴权中關聯開啟了認證的路由,完成授權。

建立消費者

  1. 登入MSE網關管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列選擇云原生网关 > 网关列表

  3. 网关列表頁面,單擊目標網關名稱。

  4. 在左側導覽列,單擊安全管理 > 消费者鉴权

  5. 單擊创建消费者按鈕。

  6. 配置相關參數,然後單擊确定

    配置參數說明如下。

    配置項

    描述

    消费者名称

    自訂消費者的名稱。

    消费者说明

    對消費者進行描述。

    认证方式

    當前消費者支援的認證方式。

    密钥类型

    • 对称密钥:產生一份預設的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。

    消費者.png

  • 設定消費者標識。即claims.setClaim("uid", "11215ac069234abcb8944232b79ae711"),該消費者標識為建立消費者時控制台預設產生,也可以根據自身邏輯進行修改。

    消費者標識.png

    您也可以在建立消費者後,在消費者基礎配置頁擷取消費者標識。擷取消費者標識.png

  • 設定密碼編譯演算法。即jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.HMAC_SHA256),該密碼編譯演算法要和JWKS保持一致。

    說明

    目前支援的密碼編譯演算法有ES256、ES384、ES512、RS256、RS384、RS512、PS256、PS384、PS512、HS256、HS384、HS512和EdDSA。

    密碼編譯演算法.png

    使用對稱式加密的時候,需要對"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中添加自訂參數。

開啟路由認證

  1. 登入MSE網關管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列選擇云原生网关 > 网关列表

  3. 网关列表頁面,單擊目標網關名稱。

  4. 在左側導覽列,單擊路由管理,然後選擇路由頁簽。

  5. 在需要變更的路由規則操作列,單擊策略配置

  6. 策略配置頁簽,單擊认证。配置完成後,單擊儲存

    參數

    描述

    認證方式

    當前路由認證消費者時使用的認證方式。

    開啟狀態

    開啟後,認證鑒權生效。

授權給消費者

  1. 登入MSE網關管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列選擇云原生网关 > 网关列表

  3. 网关列表頁面,單擊目標網關名稱。

  4. 在左側導覽列,單擊安全管理 > 消费者鉴权

  5. 在需要變更的消費者規則操作列單擊授权

  6. 消费者授权頁簽,單擊关联路由,選擇要授權給當前消費者的路由,然後單擊确定