ブラウザからこのようなPOSTリクエストを送信しています:
fetch(serverEndpoint, {
method: 'POST',
mode: 'no-cors', // this is to prevent browser from sending 'OPTIONS' method request first
redirect: 'follow',
headers: new Headers({
'Content-Type': 'text/plain',
'X-My-Custom-Header': 'value-v',
'Authorization': 'Bearer ' + token,
}),
body: companyName
})
リクエストがバックエンドに届くまでに、X-My-Custom-Header
もAuthorization
ヘッダーも含まれていません。
私のバックエンドは、Firebase用のGoogle Cloud関数(基本的にはNode.jsエンドポイントのみ)で、次のようになります。
exports.createCompany = functions.https.onRequest((req, res) => {
let headers = ['Headers: ']
for (let header in req.headers) {
headers.Push(`${header} : ${req.headers[header]}`)
}
console.log(headers)
...
}
Firebase向けGoogle Cloud機能のコンソールログには、X-My-Custom-Header
もAuthorization
ヘッダーも含まれていません。
なにが問題ですか?
Chromeの開発ツールを使用して、X-My-Custom-Header
ヘッダーもAuthorization
ヘッダーもブラウザーから送信されないことを確認しました...質問は次のとおりです。なぜですか?どうすれば修正できますか?
私のアプリの詳細:Reactアプリです。サービスワーカーを無効にしました。 Request
を作成し、req.headers.append()
を使用して具体的にヘッダーを追加しようとしました。ヘッダーはまだ送信されません。
same-Origin policy は、Webページが別のOriginからリソースに送信できるリクエストの種類を制限します。
no-cors
mode では、ブラウザは「単純な」リクエストの送信に制限されます。 safelistedメソッド および safelisted headers のみのリクエストです。
Authorization
やX-My-Custom-Header
などのヘッダーを持つクロスオリジンリクエストを送信するには、no-cors
モードを削除し、プリフライトリクエスト(OPTIONS
)をサポートする必要があります。
「単純な」リクエストと「非単純な」リクエストの違いは、歴史的な理由によるものです。 Webページは常にさまざまな手段(フォームの作成や送信など)でクロスオリジンリクエストを実行できるため、Webブラウザーがクロスオリジンリクエストを送信する原則的な手段を導入したとき( クロスオリジンリソース共有 、またはCORS)、そのような「単純な」リクエストはプリフライトOPTIONS
チェックから免除されることが決定されました。
まず:new Headers(..)
の代わりにオブジェクトを使用します:
fetch('www.example.net', {
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'X-My-Custom-Header': 'value-v',
'Authorization': 'Bearer ' + token,
}
});
二番目に:知っておくとよい、ヘッダーはfetch
!!で小文字になっています!!
番目:no-cors
モードは、ヘッダーの使用をこのホワイトリストに制限します。
Accept
Accept-Language
Content-Language
Content-Type
およびその値は(application/x-www-form-urlencoded
、multipart/form-data
、text/plain
)Content-Type
またはAuthorization
ではなく、X-My-Custom-Header
ヘッダーのみが送信される理由です。
これを試してもらえますか?
fetch(serverEndpoint, {
credentials: 'include'
})
1番目:exports.createCompany関数でヘッダーを呼び出すと、小文字のH
ではなく、大文字のh
を持つlet headers = ['Headers: ']
があり、エラーが発生する可能性があります。また、ヘッダー内のトークンの後にカンマがありますが、ヘッダーは存在しないはずです。
2番目:反応ネイティブでフェッチリクエストを使用するたびに、header:
はnew Headers
を必要としません。
これを試してください:fetch(serverEndpoint, { method: 'POST', mode: 'no-cors', redirect: 'follow', headers:{ 'Content-Type': 'text/plain', 'X-My-Custom-Header': 'value-v', 'Authorization': 'Bearer ' + token }, body: companyName })
私もこれと同じ問題を抱えていました。 javascriptから「no-cors」を削除し、サーバー側のスプリングブートに以下を追加することで解決しました。
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity httpSecurity) throws Exception {
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
}
}