laravelで作成したapiをjsのXMLHttpRequestを使って叩こうとしています。
サーバー側とクライアント側は違うサーバーで運用しており、共にbasin認証がかけてあります。
サーバー側
laravelを使って作成しています。 Corsの許可をおこなっているmiddlewareは以下です。
php
1// middleware/Cors.php 2 public function handle($request, Closure $next) 3 { 4 return $next($request) 5 ->header('Access-Control-Allow-Origin','*') 6 ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') 7 ->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, Authorization, X-Requested-With') 8 ->header('Access-Control-Allow-Credentials', 'true'); 9 }
クライアント側
jsのXMLHttpRequestを使って叩いています。
js
1 var request = new XMLHttpRequest(); 2 // URLを開く 3 request.open('GET', url , [true,clientId,clientSecret]); 4 request.responseType = 'json'; 5 6 // レスポンスが返ってきた時の処理を記述 7 request.onload = function () { 8 // レスポンスが返ってきた時の処理 9 //省略 10 } 11 // リクエストをURLに送信 12 request.send();
エラー内容
error
1index.php:1864 GET http://サーバーurl 401 (Unauthorized) 2 (anonymous) @ index.php:1864 3 mightThrow @ jquery-3.4.1.js:3557 4 process @ jquery-3.4.1.js:3625 5 setTimeout (async) 6 (anonymous) @ jquery-3.4.1.js:3663 7 fire @ jquery-3.4.1.js:3291 8 fireWith @ jquery-3.4.1.js:3421 9 fire @ jquery-3.4.1.js:3429 10 fire @ jquery-3.4.1.js:3291 11 fireWith @ jquery-3.4.1.js:3421 12 ready @ jquery-3.4.1.js:3901 13 completed @ jquery-3.4.1.js:3911 14index.php:1 Access to XMLHttpRequest at 'http://サーバーurl' from origin 'サーバーurl' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
やってみたこと
- setRequestHeaderを使ってbasin認証の情報を付与する。
js
1var authorizationBasic = window.btoa(clientId + ':' + clientSecret); 2 3request.open('GET', 'url', true); 4request.responseType = 'json'; 5request.setRequestHeader('Authorization', 'Basic ' + authorizationBasic);
-
Postmanから叩いた場合はデータが取れます。この事からサーバー側の問題ではないのではないかと考えています。
-
開発時にlocalhostで実装した際には動いており、サーバーに乗せたときに動かなくなった為、basic認証周りではないのかと考えていますが、いくつかのXMLHttpRequestにbasic認証情報を与える試しましたが反応がなく困っております。
問題の本質が見切れていない状態ですが困ってしまいました。何か気になる方でも構いません。回答よろしくお願い致します。
解決方法
withCredentialsプロパティをtrueに設定する。
この際にサーバー側の'Access-Control-Allow-Origin'の設定がワイルドカード(*)になっているとエラーが発生するので、クライアント側のドメイン指定のみにしてあげる必要がありました。
js
1// URLを開く 2 request.open('GET', url, [true, clientId, clientSecret]); 3 request.responseType = 'json'; 4 request.withCredentials = true;
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/23 05:39