Product-apim: インメモリサブスクリプションの検証

作成日 2020年06月03日  ·  11コメント  ·  ソース: wso2/product-apim

問題を説明してください

サブスクリプション検証の場合、ゲートウェイはキーマネージャーノードで実行されているキー検証サービスを呼び出し、キーマネージャーはデータベースにアクセスして検証に必要なデータを取得します。

データベースに障害が発生した場合、実行時にリクエストが失敗する可能性があります。

ソリューションを説明してください

サーバーの起動時およびテナントのテナントのロード時に、サブスクリプションの検証に必要な情報をメモリにロードします。
アプリケーションの作成などの更新については、サブスクリプションを追加し、イベントを介してトラフィックマネージャーに通知されます。
Gatewayは、トピックを介してこのイベントをサブスクライブします。

どのように実装しますか


PrioritNormal TypNew Feature

最も参考になるコメント

私たちの要件は、APIMと一緒にマイクロゲートウェイを使用することです。 ユーザーはAPIMでJWTを生成し、それらを使用して個々のMicro-GWにアクセスします。 以前は、サブスクライブされたすべてのAPIがJWTメタデータに存在し、Micro-GWによって「オフライン」で検証できました。 この新しいセットアップでは、すべてのMicro-GWインスタンスがJMSサブスクリプションをリッスンして最新の状態に保つ必要がありますか? (そして、どのサブスクリプションがクライアントに利用可能であるかをJWTで確認する方法はありません)

潜在的に数百のマイクロGWがあると、誰かが401を取得している理由をデバッグするのは面倒だと思っています...トピックが登録されていませんでしたか?マイクロGWを再起動して作成する必要がありますか?すべてのサブスクリプションメタデータをダウンロードします。Micro-GWの起動時にAPIMが応答しない場合はどうなりますか。すべてのサブCribedAPIとメタデータをJWTメタデータに添付すると、ソリューションがはるかに「堅牢」になり、 Micro-GW:sは、JWTがすべての情報を保持しているため、APIMとは何の関係もありませんでした(クライアントは、キーを使用してアクセスできるサブスクリプションをJWTメタデータでチェックインできました)。 したがって、私が必要としているのは、Micro-GWで使用する古い動作JWTを生成する方法です。 たぶん、APIM用にJWT-Generator-classを拡張することで可能になるでしょうか? (または、この新しい処理により、それを達成するのが非常に困難になりますか?)

全てのコメント11件

@isharac

サーバーの起動時およびテナントのテナントのロード時に、サブスクリプションの検証に必要な情報をメモリにロードします。

PR wso2 / carbon-apimgt#8563では、現時点ではサービスは保護されていません。 これらのサービスはどのように保護されますか? 基本認証またはOAuth?

@isharac @chamilaadhi
また、この変更により、JWTおよびキー検証応答ペイロードの下から正確にどの属性が失われますか。


JWT:

{
  "aud": "http://org.wso2.apimgt/gateway",
  "sub": "[email protected]",
  "application": {
    "owner": "admin",
    "tierQuotaType": "requestCount",
    "tier": "10PerMin",
    "name": "New App",
    "id": 2,
    "uuid": null
  },
  "scope": "am_application_scope default",
  "iss": "https://localhost:9443/oauth2/token",
  "tierInfo": {
    "Unlimited": {
      "tierQuotaType": "requestCount",
      "stopOnQuotaReach": true,
      "spikeArrestLimit": 0,
      "spikeArrestUnit": null
    }
  },
  "keytype": "PRODUCTION",
  "subscribedAPIs": [
    {
      "subscriberTenantDomain": "carbon.super",
      "name": "PizzaShackAPI",
      "context": "/pizzashack/1.0.0",
      "publisher": "admin",
      "version": "1.0.0",
      "subscriptionTier": "Unlimited"
    }
  ],
  "consumerKey": "some_value",
  "exp": 3738643151,
  "iat": 1591159504,
  "jti": "some_valu2"
}


主要な検証応答

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <ns:validateKeyResponse xmlns:ns="http://org.apache.axis2/xsd">
            <ns:return xmlns:ax2129="http://keymgt.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2131="http://api.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2133="http://dto.impl.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2135="http://model.api.apimgt.carbon.wso2.org/xsd"
                       xmlns:ax2136="http://dto.api.apimgt.carbon.wso2.org/xsd"
                       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax2133:APIKeyValidationInfoDTO">
                <ax2133:apiName>$APINAME</ax2133:apiName>
                <ax2133:apiPublisher>admin</ax2133:apiPublisher>
                <ax2133:apiTier xsi:nil="true" />
                <ax2133:applicationId>$APPLICATION_ID</ax2133:applicationId>
                <ax2133:applicationName>$APPLICATION_NAME</ax2133:applicationName>
                <ax2133:applicationTier>$APPLICATION_TIER</ax2133:applicationTier>
                <ax2133:authorized>true</ax2133:authorized>
                <ax2133:authorizedDomains xsi:nil="true" />
                <ax2133:consumerKey>fxzmLefepgKF2Qa</ax2133:consumerKey>
                <ax2133:contentAware>false</ax2133:contentAware>
                <ax2133:endUserName>[email protected]</ax2133:endUserName>
                <ax2133:endUserToken xsi:nil="true" />
                <ax2133:issuedTime>15288163</ax2133:issuedTime>
                <ax2133:scopes>default</ax2133:scopes>
                <ax2133:scopes>am_application_scope</ax2133:scopes>
                <ax2133:spikeArrestLimit>0</ax2133:spikeArrestLimit>
                <ax2133:spikeArrestUnit xsi:nil="true" />
                <ax2133:stopOnQuotaReach>true</ax2133:stopOnQuotaReach>
                <ax2133:subscriber>admin</ax2133:subscriber>
                <ax2133:subscriberTenantDomain>carbon.super</ax2133:subscriberTenantDomain>
                <ax2133:throttlingDataList>api_level_throttling_key</ax2133:throttlingDataList>
                <ax2133:tier>$TIER</ax2133:tier>
                <ax2133:type>$KEY_TYPE</ax2133:type>
                <ax2133:userType>APPLICATION</ax2133:userType>
                <ax2133:validationStatus>0</ax2133:validationStatus>
                <ax2133:validityPeriod>9223376854775807</ax2133:validityPeriod>
            </ns:return>
        </ns:validateKeyResponse>
    </soapenv:Body>
</soapenv:Envelope>

@isharac

サーバーの起動時およびテナントのテナントのロード時に、サブスクリプションの検証に必要な情報をメモリにロードします。

PR wso2 / carbon-apimgt#8563では、現時点ではサービスは保護されていません。 これらのサービスはどのように保護されますか? 基本認証またはOAuth?

これは基本認証で保護されています。

@pramindaこの変更後、JWTの標準的なJWTクレームはOauthプロバイダーからのもののみになります

Ok。 したがって、JWTから以下の属性を失います。

"application": {},
"tierInfo": {},
"keytype": "",
"subscribedAPIs": [],

キー検証応答では、次の属性のみ使用可能になり

<ax2133:apiName>$APINAME</ax2133:apiName>
<ax2133:apiPublisher>admin</ax2133:apiPublisher>
<ax2133:apiTier xsi:nil="true" />
<ax2133:authorized>true</ax2133:authorized>
<ax2133:authorizedDomains xsi:nil="true" />
<ax2133:consumerKey>fxzmLefepgKF2Qa</ax2133:consumerKey>
<ax2133:contentAware>false</ax2133:contentAware>
<ax2133:endUserName>[email protected]</ax2133:endUserName>
<ax2133:endUserToken xsi:nil="true" />
<ax2133:issuedTime>15288163</ax2133:issuedTime>
<ax2133:scopes>default</ax2133:scopes>
<ax2133:scopes>am_application_scope</ax2133:scopes>
<ax2133:userType>APPLICATION</ax2133:userType>
<ax2133:validationStatus>0</ax2133:validationStatus>
<ax2133:validityPeriod>9223376854775807</ax2133:validityPeriod>

これが実装されています。

ユーザーがこの動作を構成できるようにするための考慮事項はありますか? 最新の状態に保つためにJMSサブスクリプションに依存するよりも、JWTですべての情報を取得できる方がはるかに望ましいでしょう。 または、少なくともデータベースからのすべてのサブスクリプションを使用してJWTを生成する方法はありますか? (特にmicro-gwと一緒に使用する場合)。

こんにちは@ christian-morin
これが現在のデフォルトの動作であるため、構成可能にする予定はありません。
また、サードパーティのキーマネージャーはサブスクリプションメタデータを認識しないため(DBは共有されないため)、サードパーティのKMから生成されたJWTにサブスクリプションデータを含めることはできません。

あなたがあなたの特定の要件を共有することができれば、多分私たちは解決策を考え出すことができます。

私たちの要件は、APIMと一緒にマイクロゲートウェイを使用することです。 ユーザーはAPIMでJWTを生成し、それらを使用して個々のMicro-GWにアクセスします。 以前は、サブスクライブされたすべてのAPIがJWTメタデータに存在し、Micro-GWによって「オフライン」で検証できました。 この新しいセットアップでは、すべてのMicro-GWインスタンスがJMSサブスクリプションをリッスンして最新の状態に保つ必要がありますか? (そして、どのサブスクリプションがクライアントに利用可能であるかをJWTで確認する方法はありません)

潜在的に数百のマイクロGWがあると、誰かが401を取得している理由をデバッグするのは面倒だと思っています...トピックが登録されていませんでしたか?マイクロGWを再起動して作成する必要がありますか?すべてのサブスクリプションメタデータをダウンロードします。Micro-GWの起動時にAPIMが応答しない場合はどうなりますか。すべてのサブCribedAPIとメタデータをJWTメタデータに添付すると、ソリューションがはるかに「堅牢」になり、 Micro-GW:sは、JWTがすべての情報を保持しているため、APIMとは何の関係もありませんでした(クライアントは、キーを使用してアクセスできるサブスクリプションをJWTメタデータでチェックインできました)。 したがって、私が必要としているのは、Micro-GWで使用する古い動作JWTを生成する方法です。 たぶん、APIM用にJWT-Generator-classを拡張することで可能になるでしょうか? (または、この新しい処理により、それを達成するのが非常に困難になりますか?)

こんにちは@ christian-morin
ユースケースをサポートするために、2つのオプションを考え出すことができます。

オプション1:
MG3.2.0でAPIM3.1.0を使用する

オプション2:
API-M 3.2.0を使用し、[1]で説明されているようにTokenIssuerをカスタマイズします。
この場合、APIMdbをKeyManagerノードと共有する必要があり、JWTに必要なクレームを追加できるようになります。

お役に立てれば!
[1] https://is.docs.wso2.com/en/latest/learn/extension-points-for-oauth/#oauth -token-generator

こんにちは@isharac

返信してくれてありがとう。 オプション1は、製品をアップグレードできないため、長期的なソリューションとしてはあまり適していないと思いますか? ;)

あなたが提案するように、カスタマイズされたTokenIssuerを作成する必要があるのではないかと思いましたが、それが可能であることを知ってうれしく思います。 ありがとう。

このページは役に立ちましたか?
0 / 5 - 0 評価