ajaxで別ドメインに対して、プログラムを実行したい時に注意すべきことなどを。
Contents
ログ、レスポンスヘッダをとにかく追う
アクセス先のログやブラウザのレンポンスヘッダーを注意深くみてどういう結果が帰ってきているのかをしっかり追うようにしましょう。その上で下記のような対策が必要になってきます。
特定ドメインからの許可
ajaxから直で他サーバーにアクセスをする場合ですが、下記のようなエラーメッセージが出て弾かれる場合が多いかと思います。
1 |
No 'Access-Control-Allow-Origin' header is present on the requested resource. |
通常ですとクロスドメインからのリクエストが許可されていないことが多いため、弾かれます。
この場合、APIを受けとる側での.htaccessなどに下記のような設定を書いておけば許可することができます。
1 2 3 |
Header set Access-Control-Allow-Origin "https://example.com" Header set Access-Control-Allow-Methods "*" Header set Access-Control-Allow-Headers "*" |
アスタリスクは全許可ですが、POST,GETなどのメソッド単位でのコントールやHearderでのControlもできるでしょう。
*ただしmod_headerがインストールされていることが前提のようです。
フレームワーク側での認証ロジック(フレームワークによる)
上記のような対策をしてもエラーが返ってきてしまうということは多いかと思います。その場合、302エラーの場合、フレームワークの認証ロジックを疑ってみましょう。
私の場合、Laravelだったのですが、Routeでコントロールできる通常の認証以外にも、認証をコントールしている場合があるので、その部分を調べてみましょう。
CSRF対策(フレームワークによる)
Laravelの場合、上記の対策がディフォルトで組み込まれているので、通常認証をクリアできても500エラーが返ってきます。その場合、MiddleWare内でIP制限などをすると良いと思います。
一例として下記のような書き方ができます。
1 2 3 4 5 6 7 8 9 |
public function handle($request, \Closure $next) { //特定のIPとアクション時に許可する if($request->ip() == '特定IP' && $reques->is('/sampleaction/action2')) { return $next($request); } return parent::handle($request, $next); } |
500エラー対策
実際のAPIまで処理が飛んでいればあと一歩かと思いますが、500エラーで返ってきてしまう場合はプログラムのどこかで落ちているため、とにかくこまめにログを追うしかないと思います。
API時の実装時に注意しておきましょう。
ajax側のHTTPヘッダ
ajax側のHTTPリクエストが適切でない場合、配列を送っているのに、内容がからということがあります。その場合、ajaxのheadをapplication/json
にするかJSON.stringify
でPOST内容を文字列化しましょう。
ちなみにブラウザでajaxを飛ばして直接アクセスするより、ローカルのPHPにajaxにアクセスをして、PHP側からサーバーを通してAPIにアクセスした方がテストも簡単で実行しやすいです。(CurlよりはGuzzleなどのライブラリを使いましょう。)
参考リンク
XHR2でサブドメインのワイルドカードOriginに対してCORSを許可する設定、他。
今時のPHP HTTPクライアントのGuzzleを使ってみた