---
schema_version: "1"
id: 2784a7fc26962887411a9a16642c3f9f306734c352242cde84764589f49d37b0
title: CORS ライブラリ関数の使用
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/pdk/1.4/policies-pdk-configure-features-cors.md
canonical_url: https://docs.mulesoft.com/jp/pdk/1.4/policies-pdk-configure-features-cors
source_site: docs.mulesoft.com
content_type: documentation
content_hash: 87b26bc95ad2bd1fe3b724a2c79f59c24e73a842784fc8c360e268bd9ab92930
description: MuleSoft Documentation Site
release: "1.4"
latest: false
---
# CORS ライブラリ関数の使用

<table><tbody><tr><td class="icon"><i class="fa icon-note" title="Note"></i></td><td class="content">Flex Gateway ポリシー開発キット (PDK) のクロスオリジンリソース共有 (CORS) ライブラリを使用したポリシープロジェクトの例は、 <a href="https://github.com/mulesoft/pdk-custom-policy-examples/blob/1.4.0/cors-validation/README.md" target="_blank" rel="noopener">「CORS Validation Policy Example (CORS 検証ポリシーの例)」</a>​を参照してください。</td></tr></tbody></table>

CORS は、Web アプリケーションが別のドメインで定義されたリソースにアクセスするためのメカニズムです。ブラウザーでは、デフォルトで CORS がサポートされています。PDK CORS ライブラリは、 [CORS W3C 勧告](https://fetch.spec.whatwg.org/)​の標準に準拠しており、受信要求を検証してリソースを保護する一連のツールが用意されています。

## [](#cors-configuration)CORS 設定インスタンスを定義する

CORS ライブラリは、​`pdk::cors`​ モジュールから使用できます。このモジュールでは、受信要求の検証メソッドを定義するための ​`cors::Configuration`​、​`cors::OriginGroup`​、​`cors::AllowedMethod`​ 構造とそれらのビルダーが提供されます。たとえば、次のコードスニペットでは、​`cors::Configuration`​ インスタンスをハードコード化する関数を定義します。

```Rust
use pdk::cors;

fn create_cors_configuration() -> cors:Configuration {
    cors::Configuration::builder()
        .public_resource(false)
        .support_credentials(true)
        .origin_groups(vec![cors::OriginGroup::builder()
            .origin_group_name("default group".to_string())
            .plain_origins(vec!["http://www.the-origin-of-time.com".to_string()])
            .access_control_max_age(60)
            .headers(vec![
                "x-allow-origin".to_string(),
                "x-yet-another-valid-header".to_string(),
            ])
            .exposed_headers(vec!["x-forwarded-for".to_string()])
            .allowed_methods(vec![
                cors::AllowedMethod::builder()
                    .method_name("POST".to_string())
                    .allowed(true)
                    .build()
                    .unwrap(),
                cors::AllowedMethod::builder()
                    .method_name("PUT".to_string())
                    .allowed(true)
                    .build()
                    .unwrap(),
            ])
            .build()
            .unwrap()])
        .build()
        .unwrap();
}
```

### [](#configuration-methods)cors::Configuration 構造の設定パラメーター

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">プロパティ</th>
<th class="tableblock halign-left valign-top">必須または省略可能</th>
<th class="tableblock halign-left valign-top">デフォルト値</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>origin_groups</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>空の ​<code>Vec</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>cors::OriginGroup</code>​ で設定可能なオリジンのグループが含まれる ​<code>Vec</code>​。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>public_resource</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>false</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>CORS 設定が公開リソースとして適用されるかどうかを示すブール値。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>support_credentials</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>false</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>CORS 設定が Cookie、認証ヘッダー、TLS クライアント証明書などのログイン情報をサポートするかどうかを示すブール値。</p>
</div></div></td>
</tr>
</tbody>
</table>

### [](#origin-group-methods)cors::OriginGroup 構造の設定パラメーター

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">プロパティ</th>
<th class="tableblock halign-left valign-top">必須または省略可能</th>
<th class="tableblock halign-left valign-top">デフォルト値</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>plain_origins</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>空の ​<code>Vec</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>グループに含まれるオリジンの ​<code>Vec</code>​。例: <code>http://www.the-origin-of-time.com</code>​。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>access_control_max_age</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>30</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>新しいプレフライト要求を送信する前にプレフライト応答をキャッシュする期間 (秒)。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>allowed_methods</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>空の ​<code>Vec</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>cors::AllowedMethod</code>​ で設定可能な許可される HTTP メソッドの ​<code>Vec</code>​。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>headers</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>空の ​<code>Vec</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>プレフライト要求の HTTP ヘッダーの ​<code>Vec</code>​。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>exposed_headers</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>省略可能</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>空の ​<code>Vec</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>ブラウザーの JavaScript でアクセスできるヘッダーの ​<code>Vec</code>​。</p>
</div></div></td>
</tr>
</tbody>
</table>

### [](#allowed-methods)cors::AllowedMethod 構造の設定パラメーター

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">プロパティ</th>
<th class="tableblock halign-left valign-top">必須または省略可能</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>method_name</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>必須</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>メソッド名。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>is_allowed</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>必須</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>メソッドが許可されるかどうかを示すブール値。サポートされている値は、​<code>CONNECT</code>​、​<code>DELETE</code>​、​<code>GET</code>​、​<code>OPTIONS</code>​、​<code>PATCH</code>​、​<code>POST</code>​、​<code>PUT</code>​、または ​<code>TRACE</code>​ です。</p>
</div></div></td>
</tr>
</tbody>
</table>

## [](#applying-cors-to-an-incoming-request)CORS 検証メソッド

`cors::Cors`​ 構造には、指定された ​`cors::Configuration`​ インスタンスに対して受信ヘッダーを検証する ​`check_headers()`​ メソッドが含まれます。​`cors::Cors::check_headers()`​ メソッドは、​`Result<cors::Check, cors::CorsError>`​ 構造を返します。CORS 検証に失敗した場合の結果は ​`Err`​ になります。検証に通過すると、要求は ​`Ok`​ になり、​`cors::Check`​ 構造を評価できます。

### [](#corscheck-構造の使用可能なメソッド)`cors::Check`​ 構造の使用可能なメソッド

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">メソッド</th>
<th class="tableblock halign-left valign-top">種別</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>response_type()</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>cors::ResponseType</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>受信要求に必要なアクションの種別が含まれる列挙を返します。列挙値についての詳細は、​<a href="#enum-response"><code>cors::ResponseType</code>​ 列挙応答値</a>​を参照してください。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>headers()</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>&amp;[(String, String)]</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>応答に追加するヘッダーのリスト。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>into_headers()</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Vec&lt;(String, String)&gt;</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>cors::Check</code>​ 構造をコンシュームして、応答に追加するヘッダーのリストを返します。</p>
</div></div></td>
</tr>
</tbody>
</table>

### [](#enum-response)`cors::ResponseType`​ 列挙応答値

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">値</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Preflight</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>受信要求は CORS プレフライト要求であるため、ポリシーで早期に応答する必要があります。</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><code>Main</code></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>受信要求は CORS メイン要求であるため、要求はアップストリームに進みます。</p>
</div></div></td>
</tr>
</tbody>
</table>

## [](#cors-検証ポリシーを記述する)CORS 検証ポリシーを記述する

CORS 検証ポリシーを記述する手順は、次のとおりです。

1. `cors::Configuration`​ インスタンスを定義する ​`#[entrypoint]`​ 関数を定義します。次の例の ​`create_cors_configuration()`​ は、[CORS 設定インスタンスを定義する](#cors-configuration)の例で定義された関数です。
    
    ```rust
    use pdk::*;
    use pdk::cors;
    
    #[entrypoint]
    async fn configure(launcher: Launcher) -> Result<(), LaunchError> {
    
        let cors_configuration = create_cors_configuration();
    
        let filter = on_request(|rs| request_filter(rs, &cors_configuration))
            .on_response(response_filter);
    
        launcher.launch(filter).await
    }
    ```
2. CORS 検証メソッドを使用して受信要求を検証する ​`request_filter()`​ 関数を定義します。返される​`フロー`​には、​`cors::Cors::check_headers()`​ から返されたヘッダーを ​`response_filter()`​ に渡す ​`Vec<(String, String)>`​ が含まれている必要があります。
    
    ```rust
    async fn request_filter(
        request_headers_state: RequestHeadersState,
        cors_configuration: &cors::Configuration<'_>,
    ) -> Flow<Vec<(String, String)>> {
    
        // Create a new CORS checker.
        let cors = cors::Cors::new(cors_configuration);
    
        let request_headers = request_headers_state.handler().headers();
    
        let cors_result = cors.check(&request_headers);
    
        match cors_result {
    
            // The CORS validation was succesful.
            Ok(cors_check) => match cors_check.response_type() {
    
                // A CORS preflight fetch was requested, return an early response.
                cors::ResponseType::Preflight => {
                    Flow::Break(Response::new(200).with_headers(check.into_headers()))
                }
    
                // This is a CORS main request, continue and pass the headers to the response.
                cors::ResponseType::Main => {
                    logger::info!("Main CORS response.");
                    Flow::Continue(check.into_headers())
                }
            },
    
            // The CORS validation failed. The request must be refused.
            Err(cors_error) => {
                Flow::Break(Response::new(200))
            }
        }
    }
    ```
3. CORS 検証メソッドを使用して応答を検証する ​`response_filter()`​ 関数を定義します。 `RequestData`​ には、​`cors::Cors::check_headers()`​ で返されるヘッダーが含まれます。
    
    ```rust
    async fn response_filter(state: ResponseHeadersState, data: RequestData<Vec<(String, String)>>) {
    
        // Take the headers to add from the request data.
        let RequestData::Continue(headers_to_add) = data else {
            return;
        };
    
        // Add the headers to the response
        for (name, value) in headers_to_add.iter() {
            state.handler().set_header(name, value);
        }
    }
    ```

## [](#関連情報)関連情報

- [Rust でのカスタムポリシー機能の実装](https://docs.mulesoft.com/jp/pdk/1.4/policies-pdk-configure-features)