UnJSのNitroでAPIサーバを開発しているときに、
CORSでハマったときにいろいろ調べたときの備忘録(*´ω`*)
preflight requestというのがあり、
OPTIONS
methodでリクエストが飛んでくるが、
GET
しか許可していなかったため、うまくいかなかったっぽい
nitro.config.tsの設定
nitro.config.ts
のrouteRules
で、
全ルートにCORSの設定を追加。
//https://nitro.unjs.io/config export default defineNitroConfig({ routeRules: { // ネストを含む全てのルートに適用 "/**": { cors: true, headers: { // すべてのoriginを許可 "Access-Control-Allow-Origin": "*", // 許可するmethod "Access-Control-Allow-Methods": "OPTIONS,GET,POST,PUT,PATCH,DELETE", // 許可するリクエストヘッダ "Access-Control-Allow-Headers": "Authorization,X-API-KEY", // 許可するレスポンスヘッダ "Access-Control-Expose-Headers": "X-CUSTOM", // iframeを許可しない "X-FRAME-OPTIONS": "DENY", } } } });
OPTIONS
のリクエストへの対応
OPTIONS
のリクエストへの対応するために、
全ルートのOPTIONS
メソッドでOKを返すファイルを追加する。
// routes/[...].options.ts export default eventHandler((event) => { // CORSのprefilght request対応 // optionsの場合はOK(200)を返す return; });
middlewareまわりも
middlewareで認証処理している場合は、
OPTIONSのときに無視するように設定しておく
// middleware/auth.ts export default defineEventHandler(async (event) => { // CORSのprefilght request対応: OPTIONSメソッドの場合はskip if (event.method == "OPTIONS") return; // ...認証処理 });
以上!! 地味にハマったけどなんとかなった(*´ω`*)
参考にしたサイト様
- CORS(preflight request)にハマったけど解決した話 #JavaScript - Qiita
- Config · Nitro
- Nitro ServerでCORSを設定する - くらげになりたい。
- CORS - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- Preflight request (プリフライトリクエスト) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN
- Access-Control-Allow-Methods - HTTP | MDN
- Access-Control-Allow-Origin - HTTP | MDN
- X-Frame-Options について簡単に調べてみた #HTTP - Qiita
- Bearer認証付きAPIでCORSエラーとたたかった記録 #JavaScript - Qiita
- CORSまとめ #JavaScript - Qiita
- X-Frame-Options - HTTP | MDN