ajaxでphpセッションが使えなかったときの対応
まずやりたかったこと
ログインフォームとボタンだけ設置してログインボタン押下でajax通信で外部のサーバへ認証処理を行う。
サーバ側での認証がokだったらphpのセッション変数に保存。
ログイン成功後はhtmlからajax通信でphpで作成したapiにアクセスしていろいろやろうかなと考えていた
よくあるwebアプリなのですが、これをローカルのhtmlで行おうとして何故か上手くいかなかった、、、(apiはサーバ)
ローカルhtmlだと上手くいかない?
のかと思ったのですが、クロスドメインへの通信であることが問題だったようです。
googleで調べたところ以下を対応することで上手くいきました
html側
$.ajax({
type: "POST",
url: "http://example.com/api/login",
data: "id=example@example.com&password=1234567890",
xhrFields: {withCredentials: true}, //★コレを追加
success: function(data){
console.log(data);
}
});php側
//★以下2行を追加
header('Access-Control-Allow-Origin: null');
header('Access-Control-Allow-Credentials: true');
//認証結果などを送信CORSというみたいなのですが、クロスドメインでphpセッション(というかクッキーを送信して)使う場合は、この仕組みを使う必要があるようです。
で上記のコードでそれを実現できるそうです。
chrome、firefoxでこれで上手く言ったのですが、safariだと上手くいきませんでした。
ブラウザのデフォルトの設定でサードパーティのサーバへクッキーを送信しないようになっているようです、、、
独自でワンタイムキーみたいなものを作成して独自のセッション管理のような仕組みを作ってしまうのも難しくはないのでありかなと思うのですが。
できるだけ単純にしたいのでこういう場合はどうするのが定石なのだろう、、、
とりあえず上手くいかない理由はわかったので解決はしそうなのでよかったのですが、、、
どなたか自分はこうしてるよ。等あったらぜひご教授くだささい!