CORS は、様々なオプションを使用して CORS を有効にするために使用できる Connect/Express ミドルウェアを提供する node.js パッケージです。CORS
Twitter で私 (@troygoode) をフォローしてください!
これは、Node.js モジュールであり、npm レジストリ を介して利用できます。インストールは、npm install
コマンド を使用して行います。
$ npm install 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')
})
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')
})
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')
})
このモジュールは、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 リクエストは「複雑」と見なされ、最初の 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())
)として使用する場合、プリフライトリクエストはすべてのルートで既に処理されています。
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
- origin
を true
に設定して、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)
として呼び出され、origin
は origin
オプションの非関数値です)を 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
そのデモのコードはこちらにあります。