cors

NPM Version NPM Downloads Build Status Test Coverage

CORS は、様々なオプションを使用して CORS を有効にするために使用できる Connect/Express ミドルウェアを提供する node.js パッケージです。CORS

Twitter で私 (@troygoode) をフォローしてください!

インストール

これは、Node.js モジュールであり、npm レジストリ を介して利用できます。インストールは、npm install コマンド を使用して行います。

$ npm install cors

使用方法

簡単な使用方法(すべての CORS リクエストを有効にする)

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

app.get('/products/:id', function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for all origins!'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

単一ルートの CORS を有効にする

var express = require('express')
var cors = require('cors')
var app = express()

app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

CORS の設定

var express = require('express')
var cors = require('cors')
var app = express()

var corsOptions = {
  origin: 'http://example.com',
  optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204
}

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for only example.com.'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

動的オリジンを使用した CORS の設定

このモジュールは、origin オプションに提供された関数を使用して、オリジンを動的に検証することをサポートしています。この関数は、オリジン(リクエストにオリジンがない場合は undefined)を表す文字列と、callback(error, origin) というシグネチャを持つ callback を受け取ります。

コールバックへの origin 引数は、関数以外、ミドルウェアの origin オプションに許可される任意の値にすることができます。「設定オプション」セクションで、可能なすべての値のタイプについて詳しく説明しています。

この関数は、データベースなどのバックエンドデータソースから許可されたオリジンを動的にロードできるように設計されています。

var express = require('express')
var cors = require('cors')
var app = express()

var corsOptions = {
  origin: function (origin, callback) {
    // db.loadOrigins is an example call to load
    // a list of origins from a backing database
    db.loadOrigins(function (error, origins) {
      callback(error, origins)
    })
  }
}

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for an allowed domain.'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

CORS プリフライトの有効化

特定の CORS リクエストは「複雑」と見なされ、最初の OPTIONS リクエスト(「プリフライトリクエスト」と呼ばれる)が必要です。「複雑」な CORS リクエストの例としては、GET/HEAD/POST 以外の HTTP 動詞を使用するリクエストや、カスタムヘッダーを使用するリクエストなどがあります。プリフライトを有効にするには、サポートするルートに新しい OPTIONS ハンドラーを追加する必要があります。

var express = require('express')
var cors = require('cors')
var app = express()

app.options('/products/:id', cors()) // enable pre-flight request for DELETE request
app.del('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for all origins!'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

次のようにして、全体でプリフライトを有効にすることもできます。

app.options('*', cors()) // include before other routes

注:このミドルウェアをアプリケーションレベルのミドルウェア(たとえば、app.use(cors()))として使用する場合、プリフライトリクエストはすべてのルートで既に処理されています。

非同期での CORS の設定

var express = require('express')
var cors = require('cors')
var app = express()

var allowlist = ['http://example1.com', 'http://example2.com']
var corsOptionsDelegate = function (req, callback) {
  var corsOptions;
  if (allowlist.indexOf(req.header('Origin')) !== -1) {
    corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
  } else {
    corsOptions = { origin: false } // disable CORS for this request
  }
  callback(null, corsOptions) // callback expects two parameters: error and options
}

app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for an allowed domain.'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

設定オプション

  • origin: Access-Control-Allow-Origin CORS ヘッダーを設定します。可能な値
    • Boolean - origintrue に設定して、req.header('Origin') で定義されているように、リクエストオリジン を反映するか、false に設定して CORS を無効にします。
    • String - origin を特定のオリジンに設定します。たとえば、"http://example.com" に設定した場合、「http://example.com」からのリクエストのみが許可されます。
    • RegExp - origin を正規表現パターンに設定します。これはリクエストオリジンのテストに使用されます。一致した場合、リクエストオリジンが反映されます。たとえば、パターン /example\.com$/ は、「example.com」で終わるオリジンからのリクエストを反映します。
    • Array - origin を有効なオリジンの配列に設定します。各オリジンは String または RegExp にすることができます。たとえば、["http://example1.com", /\.example2\.com$/] は、「http://example1.com」または「example2.com」のサブドメインからのリクエストを受け入れます。
    • Function - origin をカスタムロジックを実装する関数に設定します。関数は、リクエストオリジンを最初の引数として、コールバック(callback(err, origin) として呼び出され、originorigin オプションの非関数値です)を 2 番目の引数として受け取ります。
  • methods: Access-Control-Allow-Methods CORS ヘッダーを設定します。コンマ区切りの文字列(例:「GET,PUT,POST」)または配列(例:['GET', 'PUT', 'POST'])が必要です。
  • allowedHeaders: Access-Control-Allow-Headers CORS ヘッダーを設定します。コンマ区切りの文字列(例:「Content-Type,Authorization」)または配列(例:['Content-Type', 'Authorization'])が必要です。指定されていない場合、リクエストの Access-Control-Request-Headers ヘッダーで指定されたヘッダーが反映されます。
  • exposedHeaders: Access-Control-Expose-Headers CORS ヘッダーを設定します。コンマ区切りの文字列(例:「Content-Range,X-Content-Range」)または配列(例:['Content-Range', 'X-Content-Range'])が必要です。指定されていない場合、カスタムヘッダーは公開されません。
  • credentials: Access-Control-Allow-Credentials CORS ヘッダーを設定します。ヘッダーを渡すには true に設定し、それ以外の場合は省略されます。
  • maxAge: Access-Control-Max-Age CORS ヘッダーを設定します。ヘッダーを渡すには整数に設定し、それ以外の場合は省略されます。
  • preflightContinue: CORS プリフライトレスポンスを次のハンドラーに渡します。
  • optionsSuccessStatus: 一部のレガシーブラウザ(IE11、さまざまなスマートテレビ)が204 でエラーになるため、成功した OPTIONS リクエストに使用するステータスコードを提供します。

デフォルトの設定は次のものと同等です。

{
  "origin": "*",
  "methods": "GET,HEAD,PUT,PATCH,POST,DELETE",
  "preflightContinue": false,
  "optionsSuccessStatus": 204
}

各 CORS ヘッダーの効果の詳細については、web.dev のこの記事をお読みください。

デモ

React を使用して CORS の動作(および動作しない状態)を示すデモをここに示します:https://node-cors-client.netlify.com

そのデモのコードはこちらにあります。

ライセンス

MIT ライセンス

作者

Troy Goode (troygoode@gmail.com)