LoginSignup
1
0

Swaggerでテスト〜CORS対策〜

Posted at

はじめに

swagger v2.0の場合だと「npm install cors --save」で「app.js」を編集していた。
でもローカルのLaravelのサーバは「 http://localhost:80/api 」だから違う気がした。
というのも、「swagger.yaml」ファイルのversionが2系の場合、CORS対応のために「npm install cors --save」をインストールして「app.js」を編集すれば、「 http://localhost:10010/swagger 」を開くとJSON形式のSwagger定義ファイルが取得できる。

詳しくはこちらの記事💁SwaggerでRESTful環境を構築する

この記事では、「openapi.yaml」ファイルが最新の3系の場合、CORS対策の方法が「npm install cors --save」ではバージョンが違うので解決できなかったので共有する。
Swaggerが2系の環境構築から3系の環境構築までの成功の道のりは下記の記事を参考。
Swaggerでテスト環境構築〜swagger.yaml編〜
Swaggerでテスト環境構築〜openapi.yaml編〜

CORSとは?

オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。ウェブアプリケーションは、自分とは異なるオリジン (ドメイン、プロトコル、ポート番号) にあるリソースをリクエストするとき、オリジン間 HTTP リクエストを実行します。

(引用:オリジン間リソース共有 (CORS)

調べると「barryvdh/laravel-cors」というライブラリをインストールする方法もあるみたい。

(参考記事:Laravelでクロスオリジン(CORS)に対応する方法

簡単に言えば、あるWebページから別のドメインのリソースにアクセスする際のセキュリティ対策のこと。

19.png

swagger-uiでテストすると、CORSオリジンエラーになってしまう。

20.png

例:「docker-compose.yaml」

    swagger-ui:
      image: swaggerapi/swagger-ui
      container_name: "post-swagger-ui"
      ports:
        - "1112:8080"
      volumes:
        - ./openapi:/openapi
      environment:
        SWAGGER_JSON: /openapi/openapi.yaml

http://localhost/api/session 」に対するリクエストが「 http://localhost:1112/ 」(swagger-uiのポート番号)から発信されている。

サーバーがCORSヘッダーを提供していないため、ブラウザがリクエストをブロックしているという認識でいいかな?

環境構築〜config/cors.phpでCORS対策〜

openapiのバージョンが3系の場合、どのようにcors対策をすればいいのか?

1、「config/cors.php」の中はデフォルトで下記のようになっている。

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['*'],

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => false,

    'max_age' => false,

    'supports_credentials' => false,

];

2、「'allowed_origins’」に「swagger-ui」のポート番号のリクエストオリジンを許可するように設定。

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    'paths' => ['*'],

    'allowed_methods' => ['*'],

    'allowed_origins' => ['http://localhost:1112'], // ここにswagger-uiのポート番号を追加

    'allowed_origins_patterns' => [],

    'allowed_headers' => ['*'],

    'exposed_headers' => false,

    'max_age' => false,

    'supports_credentials' => false,

];

まとめ

CORSは異なるオリジンからのリクエストに対する制御であり、クライアントとサーバーのやり取りにおいて、セキュリティ上の問題を回避するための仕組みということ。

同一オリジンポリシー

Webブラウザは、セキュリティ上の理由から、異なるオリジンからのJavaScriptからのHTTPリクエストを制限している。
同一オリジンポリシーにより、Webページが異なるオリジンの情報にアクセスするのを制限し、クロスサイトスクリプティングなどの攻撃から保護する。
開発ツールのコンソールにエラーを発見👀
スクリーンショット 2024-03-04 21.53.06.png
(参考記事:同一オリジンポリシー - ウェブセキュリティ | MDN developer.mozilla.org

CORSヘッダー

クライアントが異なるオリジンからのリソースにアクセスするためには、サーバーがCORSヘッダーを含む必要がある。これにより、Webブラウザはリソースへのアクセスが許可されているかどうかを確認し、許可されていればリクエストを続行する。
開発ツールのNetWorkタブを確認👀
スクリーンショット 2024-03-04 22.03.40.png
(参考記事:オリジン間リソース共有 (CORS) - HTTP | MDN developer.mozilla.org

CORSの設定

サーバー側でCORSを設定するには、以下のようなヘッダーをレスポンスに含める必要がある。

Access-Control-Allow-Origin: * 

すべてのオリジンからのアクセスを許可するもの。
実際の運用では、必要なオリジンのみを許可するように指定する。
(参考記事:オリジン間リソース共有 (CORS) - HTTP | MDN developer.mozilla.org

参考記事:
Origin (オリジン) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN developer.mozilla.org
同一オリジンポリシー - ウェブセキュリティ | MDN developer.mozilla.org
オリジン間リソース共有 (CORS) - HTTP | MDN developer.mozilla.org
LaravelでのCORS対策とmiddlewareへの理解
Laravelでクロスオリジン(CORS)に対応する方法
同一オリジンポリシーを理解する
同一オリジンポリシーとCORS
【図解】同一オリジンポリシー・CORSとは
同一オリジンポリシーを理解する。CORSエラーの原因と回避方法!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0