skillup

技術ブログ

JavaScript サーバー・ネットワーク

クロスドメインがらみのajax

投稿日:2019年2月23日 更新日:

ajaxで別ドメインに対して、プログラムを実行したい時に注意すべきことなどを。

ログ、レスポンスヘッダをとにかく追う

アクセス先のログやブラウザのレンポンスヘッダーを注意深くみてどういう結果が帰ってきているのかをしっかり追うようにしましょう。その上で下記のような対策が必要になってきます。

特定ドメインからの許可

ajaxから直で他サーバーにアクセスをする場合ですが、下記のようなエラーメッセージが出て弾かれる場合が多いかと思います。

通常ですとクロスドメインからのリクエストが許可されていないことが多いため、弾かれます。

この場合、APIを受けとる側での.htaccessなどに下記のような設定を書いておけば許可することができます。

アスタリスクは全許可ですが、POST,GETなどのメソッド単位でのコントールやHearderでのControlもできるでしょう。

*ただしmod_headerがインストールされていることが前提のようです。

フレームワーク側での認証ロジック(フレームワークによる)

上記のような対策をしてもエラーが返ってきてしまうということは多いかと思います。その場合、302エラーの場合、フレームワークの認証ロジックを疑ってみましょう。

私の場合、Laravelだったのですが、Routeでコントロールできる通常の認証以外にも、認証をコントールしている場合があるので、その部分を調べてみましょう。

CSRF対策(フレームワークによる)

Laravelの場合、上記の対策がディフォルトで組み込まれているので、通常認証をクリアできても500エラーが返ってきます。その場合、MiddleWare内でIP制限などをすると良いと思います。

一例として下記のような書き方ができます。

500エラー対策

実際のAPIまで処理が飛んでいればあと一歩かと思いますが、500エラーで返ってきてしまう場合はプログラムのどこかで落ちているため、とにかくこまめにログを追うしかないと思います。

API時の実装時に注意しておきましょう。

ajax側のHTTPヘッダ

ajax側のHTTPリクエストが適切でない場合、配列を送っているのに、内容がからということがあります。その場合、ajaxのheadをapplication/jsonにするかJSON.stringifyでPOST内容を文字列化しましょう。

ちなみにブラウザでajaxを飛ばして直接アクセスするより、ローカルのPHPにajaxにアクセスをして、PHP側からサーバーを通してAPIにアクセスした方がテストも簡単で実行しやすいです。(CurlよりはGuzzleなどのライブラリを使いましょう。)

参考リンク

サーバサイドのCORS対応

XHR2でサブドメインのワイルドカードOriginに対してCORSを許可する設定、他。

Laravel5.5 で Cross Domain する

今時のPHP HTTPクライアントのGuzzleを使ってみた

 

-JavaScript, サーバー・ネットワーク
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

シェルスクリプトでのsshログインとメール送信

久々にシェルスクリプトをやったんでその復習を。 応用範囲は結構広そうです。 Contents1 ファイルの読みこみ方2 関数の定義、使い方3 SSHログイン4 ssh鍵認証つきのログイン5 メール送信 …

no image

データのシリアライズ

おととしにJavaをやったときにでてきましたがSessionに情報を格納するときにでてきたシリアライズについて。 セッションはステートフルな状態を実現するための便利なデータの保存方法ですが、値をオブジ …

no image

障害調査フロー

実務でサーバーの障害が発生した時のフローなどをメモしおこうかと。 行ってしまうと「ログに始まり、ログにおわる」といった感じでしょうか。 サーバーエンジニアの方の作業をみてたんですが、基本的にはプログラ …

no image

URLのリライトに関して

laravelのアプリをサブディレクトリ(notサブドメイン)に配置しなくてはならないケースがあり、.htaccessと格闘したのでメモを。 このパターンはハマりが多いですね・・・ http://sk …

no image

Lambdaでの注意点

前に個人的な学習でLambdaを勉強しましたが、仕事で使う機会があり、気をつけるポイントを再度確認。 以前の学習リンク Amazon SESでの受信→S3→Lambdaでのメール転送 Contents …