OAuth2 プロバイダーの移行

Anypoint Enterprise Security の以前のプロバイダーは、Mule 4 の新しい OAuth2 プロバイダーモジュールに置き換えられます。 ただし、アプリケーションを移行するときに考慮する必要がある設定変更がいくつかあります。

グローバル設定の移行

プロバイダーのグローバル設定で行われた変更とバージョン間の違いを以下に示します。

変更された属性

属性の状況は次のとおりです。

  • 維持: 同じ名前、型、場所を使用します。

  • 移動: 属性の名前と型は同じですが、設定を行う場所が変更されました。

  • 変更: 型または名前が変更されましたが、場所は同じです。

  • 削除: 属性は存在しません。

Mule 3 の属性 状況 Mule 4 の設定

Name (名前)

維持

Name (名前)

Provider Name (プロバイダー名)

維持

Provider Name (プロバイダー名)

Host (ホスト)

削除

ホストは ​Listener Config (リスナー設定)​ の Http Configuration (Http 設定) から取得されます。

Port (ポート)

削除

ポートは ​Listener Config (リスナー設定)​ の Http Configuration (Http 設定) から取得されます。

Client Store Ref (クライアントストア参照)

変更

属性はオブジェクトストアになりました。参照または非公開オブジェクトストアの定義である必要があります。

Authorization Code Store Ref (認証コードストア参照)

移動、変更

認証コードストアは、​Authorization Config (認証設定)​ の属性として設定し、オブジェクトストアである必要があります。

Token Generator Strategy (トークンジェネレーター戦略)

維持

Token Generator Strategy (トークンジェネレーター戦略)

Token Store Ref (トークンストア参照)

移動、変更

トークンストアは、​Token Config (トークン設定)​ の属性として設定し、オブジェクトストアである必要があります。

Login Page (ログインページ)

移動

ログインページは ​Authorization Config (認証設定)​ の属性として設定します。

スコープ

維持

カンマ区切りにする必要があります。

Default Scopes (デフォルトスコープ)

維持

カンマ区切りにする必要があります。

Supported Grant Types (サポートされる付与種別)

維持

カンマ区切りにする必要があります。

Authorization Endpoint Path (認証エンドポイントパス)

変更、移動

Authorization Config (認証設定)​ の属性 ​path​ で設定できます。

Access Token Endpoint Path (アクセストークンエンドポイントパス)

変更、移動

Token Config (トークン設定)​ の属性 ​path​ で設定できます。

Authorization Ttl Seconds (認証 Ttl 秒)

削除

認証コード Ttl は、​Authorization Code Store (認証コードストア)​ オブジェクトストアで設定された entry Ttl (入力 Ttl) から取得されます。

Token Ttl Seconds (トークン Ttl 秒)

移動、変更

トークン Ttl は ​Token Store (トークンストア)​ オブジェクトストアから取得されます。コード上の制限により、この項目を ​TokenConfig​ の属性 ​tokenTtl​ と ​tokenTtlTimeUnit​ でも設定する必要があります。​Token Store (トークンストア)​ の ​entryTtl​ と ​Token Config (トークン設定)​ の ​tokenTtl​ (および ​tokenTtlTimeUnit​) は同じにする必要があります。

Refresh Token Ttl Seconds (更新トークン Ttl 秒)

削除

更新トークン Ttl は、​Refresh Token Strategy (更新トークン戦略)​ で設定されたオブジェクトストアの entry Ttl (入力 Ttl) から取得されます (ある場合)。

Connector (コネクタ)

削除

トランスポートが Mule 4 から削除されたので、この項目には意味がなくなりました。

HttpListenerConfig

変更

Listener Config (リスナー設定)​ と呼ばれるようになりました。必須です。

Resource Owner Security Provider Ref (リソースオーナーセキュリティプロバイダー参照)

変更

Ref​ が属性の名前から削除されました。Spring Security Provider (Spring セキュリティプロバイダー) が設定されている場合は、Spring Module を使用します。

Client Security Provider Ref (クライアントセキュリティプロバイダー参照)

変更

Ref​ が属性の名前から削除されました。Spring Security Provider (Spring セキュリティプロバイダー) が設定されている場合は、Spring Module を使用します。

Enable Refresh Token (更新トークンの有効化)

削除

別の ​Refresh Token Strategy (更新トークン戦略)​ に設定できます。

Issue New Refresh Token (更新トークンの新規発行)

削除

別の ​Refresh Token Strategy (更新トークン戦略)​ に設定できます。

Rate Limiter (レートリミッター)

変更

Spring bean からカスタム実装を追加する必要がなくなりました。Period Rate Limiter (期間レートリミッター) のみが実装されるようになりました。

Clients (クライアント)

維持

各クライアント定義が変更されました。

Pre Flow (プリフロー)

削除

プリフロー機能は、このバージョンではサポートされません。

ストア

Authentication Code (認証コード)、Token (トークン)、または Refresh token (更新トークン) ストアはなくなりました。これらのカスタム実装を参照できる属性はありません。 ストレージ設定は、オブジェクトストアで行われるようになりました。

カスタム動作が必要な場合は、オブジェクトストアのカスタム実装を使用してそれらの属性を設定します。

セキュリティプロバイダー

Mule 4 では、アプリケーション設定を Spring から完全に分離したので、Spirng bean を参照して設定された一部の属性の設定方法が変更されました。

Spring セキュリティプロバイダーは引き続き使用できますが、その場合、アプリケーションが機能するには Spring Module が必要です。

更新トークン属性

Mule 3 には、更新トークンの動作を設定できる 2 つの属性がありました。さまざまな更新トークン戦略が使用されるようになったので、次のように設定する必要があります。

Enable Refresh Token (更新トークンの有効化)

Issue New Refresh Token (更新トークンの新規発行)

Refresh Token Strategy (更新トークン戦略)

False

-

更新トークン戦略なし

True

False

1 つの更新トークン戦略

True

True

複数の更新トークン戦略

Clients (クライアント)

どちらの Mule バージョンでも、認証サーバーに要求を実行できるクライアントのリストを定義する可能性があります。

クライアントを追加する方法は、一部の属性名以外は変わりありません。新しいバージョンの制限により、子要素の名前は、​clients​ および ​client​ プレフィックスを追加して変更する必要がありました。

  • Redirect Uri(s) → Client Redirect Uris(s)

  • Authorized Grant Type(s) → Client Authorized Grant Type(s)

  • Scope(s) → Client Scope(s)

操作

Mule 3 のモジュールで使用可能な操作と Mule 4 で行われた変更を以下に示します

Validate Client

この操作は Mule 4 から削除されました。

Validate

この操作は、​Validate Token​ と呼ばれるようになりました。

Oauth2 プロバイダーの操作は HTTP にリンクされなくなったので、検証するトークンを解決する式が必要です。

Mule 3 では、トークン検証後、関連するリソースオーナー認証がある場合、そのリソースオーナー認証で新しいセキュリティコンテキストが作成されました。さらに、トークン情報を持つトークン保有者が mule.oauth2.access_token_store_holder というフロー変数に保存されました。
Mule 4 では、その同じ情報が若干異なる方法で保存されます。トークン検証後、​#[authentication]​ によってアクセス可能なトークン認証を使用してセキュリティコンテキストが作成されます。変数内のトークン所有者は、そのトークン認証の属性 ​#[authentication.tokenHolder]​ として保存されます。同時に、関連するリソースオーナーがある場合、その情報には ​#[authentication.tokenHolder.resourceOwnerAuthentication]​ を評価して到達できます。

Create Client

この操作は、​Fail If Present (存在する場合は失敗)​ という新しい属性が追加された以外は変わりありません。

Fail If Present (存在する場合は失敗)​ では、追加されるクライアントと同じ ID を持つクライアントが既存する場合にどうするかを指定できます。

  • true の場合、操作は失敗します。

  • false の場合、クライアント情報が更新されます。

Delete Client

この操作は変わりありません。

Revoke Token

この操作は変わりありません。

Mule 3 と Mule 4 で同じアプリケーションを設定した例を次に示します。

アプリケーションには、トークンを付与する Oauth2 プロバイダーと HTTP 要求をリスンするフローがあり、あるロジックを処理する前にトークン検証があります。

Mule 4 設定では Spring Module と Object Store Connector が使用されている点に留意してください。

どちらの場合も、アプリケーションは複数のファイルに分割されています。

Mule 3 の場合は、共通設定と実際の OAuth2 プロバイダー設定に 1 つずつ、2 つのファイルがあります。
Mule 4 の場合は、bean 定義、共通設定、実際の OAuth2 プロバイダー設定に 1 つずつ、3 つのファイルがあります。

Mule 3

共通設定

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mule-ss="http://www.mulesoft.org/schema/mule/spring-security"
    xmlns:ss="http://www.springframework.org/schema/security"
    xmlns:spring="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/spring-security http://www.mulesoft.org/schema/mule/spring-security/current/mule-spring-security.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <global-property name="allSupportedGrantTypes"
                     value="AUTHORIZATION_CODE IMPLICIT RESOURCE_OWNER_PASSWORD_CREDENTIALS CLIENT_CREDENTIALS" />

    <spring:beans>
        <spring:bean name="rateLimiter"
                     class="org.mule.modules.oauth2.provider.ratelimit.SimpleInMemoryRateLimiter" />

        <spring:bean name="clientObjectStore"
                     class="org.mule.util.store.InMemoryObjectStore" />
        <spring:bean name="authorizationCodeObjectStore"
                     class="org.mule.util.store.InMemoryObjectStore" />
        <spring:bean name="tokenObjectStore"
                     class="org.mule.util.store.InMemoryObjectStore" />
        <spring:bean name="refreshTokenObjectStore"
                     class="org.mule.util.store.InMemoryObjectStore" />

        <spring:bean name="clientStore"
                     class="org.mule.modules.oauth2.provider.client.ObjectStoreClientStore"
                     p:objectStore-ref="clientObjectStore" />

        <spring:bean name="tokenStore"
                     class="org.mule.modules.oauth2.provider.token.ObjectStoreTokenStore"
                     p:refreshTokenObjectStore-ref="refreshTokenObjectStore"
                     p:accessTokenObjectStore-ref="tokenObjectStore"/>

        <spring:bean name="authorizationCodeStore"
                     class="org.mule.modules.oauth2.provider.code.ObjectStoreAuthorizationCode"
                     p:objectStore-ref="authorizationCodeObjectStore" />

        <ss:authentication-manager id="resourceOwnerAuthenticationManager">
            <ss:authentication-provider>
                <ss:user-service id="resourceOwnerUserService">
                    <ss:user name="rousr"
                             password="ropwd+%"
                             authorities="RESOURCE_OWNER" />
                </ss:user-service>
            </ss:authentication-provider>
        </ss:authentication-manager>

        <ss:authentication-manager id="clientAuthenticationManager">
            <ss:authentication-provider>
                <ss:user-service id="clientUserService">
                    <ss:user name="clusr"
                             password="clpwd+%"
                             authorities="CLIENT" />
                </ss:user-service>
            </ss:authentication-provider>
        </ss:authentication-manager>
    </spring:beans>

    <mule-ss:security-manager>
        <mule-ss:delegate-security-provider
            name="resourceOwnerSecurityProvider"
            delegate-ref="resourceOwnerAuthenticationManager" />
        <mule-ss:delegate-security-provider
            name="clientSecurityProvider"
            delegate-ref="clientAuthenticationManager" />
    </mule-ss:security-manager>
</mule>

アプリケーション設定

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:oauth2-provider="http://www.mulesoft.org/schema/mule/oauth2-provider"
      xmlns:http="http://www.mulesoft.org/schema/mule/http"
      xsi:schemaLocation=
        "http://www.mulesoft.org/schema/mule/oauth2-provider http://www.mulesoft.org/schema/mule/oauth2-provider/current/mule-oauth2-provider.xsd
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">

    <oauth2-provider:config name="OAuth2Provider"
                            providerName="Test OAuth2Provider"
                            loginPage="static/auth.html"
                            authorizationEndpointPath="authorize"
                            accessTokenEndpointPath="token"
                            host="localhost"
                            port="8081"
                            resourceOwnerSecurityProvider-ref="resourceOwnerSecurityProvider"
                            clientSecurityProvider-ref="clientSecurityProvider"
                            clientStore-ref="clientStore"
                            tokenStore-ref="tokenStore"
                            authorizationCodeStore-ref="authorizationCodeStore"
                            rateLimiter-ref="rateLimiter"
                            scopes="GUEST USER ADMIN"
                            defaultScopes="USER"
                            supportedGrantTypes="${allSupportedGrantTypes}"
                            authorizationTtlSeconds="600"
                            tokenTtlSeconds="86400"
                            refreshTokenTtlSeconds="-1"
                            enableRefreshToken="true"
                            issueNewRefreshToken="true">

        <oauth2-provider:clients>
            <oauth2-provider:client clientId="clientId1"
                                    secret="clientSecret1"
                                    principal="clusr"
                                    type="CONFIDENTIAL">
                <oauth2-provider:redirect-uris>
                    <oauth2-provider:redirect-uri>
                        http://fake/redirect
                    </oauth2-provider:redirect-uri>
                </oauth2-provider:redirect-uris>
                <oauth2-provider:authorized-grant-types>
                    <oauth2-provider:authorized-grant-type>
                        AUTHORIZATION_CODE
                    </oauth2-provider:authorized-grant-type>
                </oauth2-provider:authorized-grant-types>
            </oauth2-provider:client>
        </oauth2-provider:clients>
    </oauth2-provider:config>

    <flow name="protected-resource-flow">
        <http:inbound-endpoint host="localhost"
                               port="8081"
                               path="protected"/>
        <oauth2-provider:validate />
        <flow-ref name="additionalLogic"/>
    </flow>

</mule>

Mule 4

Bean 設定

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ss="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-{version}.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-{version}.xsd">

        <ss:authentication-manager id="resourceOwnerAuthenticationManager">
            <ss:authentication-provider>
                <ss:user-service id="resourceOwnerUserService">
                    <ss:user name="rousr"
                             password="ropwd+%"
                             authorities="RESOURCE_OWNER" />
                </ss:user-service>
            </ss:authentication-provider>
        </ss:authentication-manager>

        <ss:authentication-manager id="clientAuthenticationManager">
            <ss:authentication-provider>
                <ss:user-service id="clientUserService">
                    <ss:user name="clusr"
                             password="clpwd+%"
                             authorities="CLIENT" />
                </ss:user-service>
            </ss:authentication-provider>
        </ss:authentication-manager>
</beans>

共通設定

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:spring="http://www.mulesoft.org/schema/mule/spring"
      xmlns:os="http://www.mulesoft.org/schema/mule/os"

      xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/spring http://www.mulesoft.org/schema/mule/spring/current/mule-spring.xsd
        http://www.mulesoft.org/schema/mule/os http://www.mulesoft.org/schema/mule/os/current/mule-os.xsd">

    <spring:config name="springConfig" files="common-config-beans.xml"/>

    <global-property name="allSupportedGrantTypes" value="AUTHORIZATION_CODE,IMPLICIT,RESOURCE_OWNER_PASSWORD_CREDENTIALS,CLIENT_CREDENTIALS"/>

    <os:object-store name="clientObjectStore"
                     persistent="true"/>
    <os:object-store name="authorizationCodeObjectStore"
                     entryTtl="600"
                     entryTtlUnit="SECONDS"
                     persistent="true"/>
    <os:object-store name="tokenObjectStore"
                     entryTtl="86400"
                     entryTtlUnit="SECONDS"
                     persistent="true"/>

    <spring:security-manager>
        <spring:delegate-security-provider name="clientSecurityProvider"
                                           delegate-ref="clientAuthenticationManager"/>
        <spring:delegate-security-provider name="resourceOwnerSecurityProvider"
                                           delegate-ref="resourceOwnerAuthenticationManager"/>
    </spring:security-manager>

</mule>

アプリケーション設定

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:oauth2-provider="http://www.mulesoft.org/schema/mule/oauth2-provider"
      xmlns:http="http://www.mulesoft.org/schema/mule/http"
      xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/oauth2-provider http://www.mulesoft.org/schema/mule/oauth2-provider/current/mule-oauth2-provider.xsd
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd">

    <http:listener-config name="listenerConfig">
        <http:listener-connection host="localhost"
                                  port="8081"/>
    </http:listener-config>

    <oauth2-provider:config name="OAuth2Provider"
                            providerName="Test OAuth2Provider"
                            resourceOwnerSecurityProvider="resourceOwnerSecurityProvider"
                            clientSecurityProvider="clientSecurityProvider"
                            supportedGrantTypes="${allSupportedGrantTypes}"
                            listenerConfig="listenerConfig"
                            clientStore="clientObjectStore"
                            scopes="GUEST,USER,ADMIN"
                            defaultScopes="USER"
                            supportedGrantTypes="${allSupportedGrantTypes}">
        <oauth2-provider:client-validation-rate-limiter>
            <oauth2-provider:period-rate-limiter/>
        </oauth2-provider:client-validation-rate-limiter>
        <oauth2-provider:token-config path="/token"
                                      tokenStore="tokenObjectStore"
                                      tokenTtl="86400"
                                      tokenTtlTimeUnit="SECONDS">
            <oauth2-provider:refresh-token-strategy>
                <oauth2-provider:multiple-refresh-tokens/>
            </oauth2-provider:refresh-token-strategy>
        </oauth2-provider:token-config>
        <oauth2-provider:authorization-config loginPage="static/auth.html"
                                              path="/authorize"
                                              authorizationCodeStore="authorizationCodeObjectStore"/>
        <oauth2-provider:clients>
            <oauth2-provider:client clientId="clientId1"
                                    secret="clientSecret1"
                                    principal="clusr"
                                    type="CONFIDENTIAL">
                <oauth2-provider:client-redirect-uris>
                    <oauth2-provider:client-redirect-uri>
                        http://fake/redirect
                    </oauth2-provider:client-redirect-uri>
                </oauth2-provider:client-redirect-uris>
                <oauth2-provider:client-authorized-grant-types>
                    <oauth2-provider:client-authorized-grant-type>
                        AUTHORIZATION_CODE
                    </oauth2-provider:client-authorized-grant-type>
                </oauth2-provider:client-authorized-grant-types>
            </oauth2-provider:client>
        </oauth2-provider:clients>
    </oauth2-provider:config>


    <flow name="protected-resource-flow">
        <http:listener path="/protected" config-ref="listenerConfig"/>
        <oauth2-provider:validate-token config-ref="OAuth2Provider"/>
        <flow-ref name="additionalLogic"/>
    </flow>

</mule>