まるでちょんまげハリウッド

ちょんはり師匠の生きざまを切り売りしています。

イチオシは転職体験記!それ以外は、いい歳したオッサンの反省です。反省はしますが、後悔はしていません。たぶん。

javascriptとPHPでなんちゃってシングルサインオン風のことをさせたい

ああああ・・・・!!!!

■ゲロ吐きそうなほど苦しんだ。

えーとね、プログラミングの小ネタです。

シングルサインオンっぽいことをさせたいけど、認証サーバーみたいなの用意できないし、ログイン管理用のDBはバラバラだし、という現実に直面したとき、やけくそで実装したから、その方法を備忘録的に。

■前提条件。

というか、させたい動作。

  • Aというサイトにログイン → B,C,Dにもログイン
  • Bというサイトにログイン → A,C,Dにもログイン

以下、C,Dでも同様にする。

はい、どこかのサイトから入ったら、グループサイトにもログインするっていう。

SSO(シングルサインオン)ってやつですよね。

■実現にあたって。

ログイン情報なんだから、COOKIEで管理すればいいじゃん。

そうだね、ただ問題が。

COOKIEドメインが違うと引き継げない、というか書き込めない。

どういうことかというと、ahoaho.comというサイトでログインして、bokeboke.jpのCOOKIEはセットできないということ。

これはセキュリティの問題と、オリジン云々の問題が絡んでくる。

オリジンについての説明は割愛、ググるか弁当でも食べてなさい。もぐもぐ。

photo by Kiss My Buttercream

COOKIEをかきこめるようにしよう。

じゃあどうやって、クロスドメインCOOKIEを書き込むようにしたかというと、javascriptをつかった。

なお、ログアウト時のことは考えてないもよう。

同一生成元ポリシー云々の問題を飛び越えるために、ちょっとした小細工をしまして・・・。

例えば、ahoaho.comからbokeboke.jpに書き込むとした場合。


1 bokeboke.jpに、bokeboke.jpへのCOOKIE書き込み用JSファイルを置きます。とりあえず、setcookie.jsとでもしておこうか。

2 ahoaho.comから、bokeboke.jpのsetcookie.jsを呼び出します。

3 ahoaho.comから、setcookie.jsのプログラムを実行します。

4 setcookie.jsから、bokeboke.jp/jslogin.phpjqueryでパラメータを投げる。

5 jslogin.phpでパラメータからログイン情報を判別、setcookieする。


この回りくどい方法で、各サイトのcookieを書き込んで回ることができたよ。

もちろん、呼び出したjs内でcookieをセットしてもよかったんだけど、今回はログイン認証を各サイトでかける必要があったので、わざわざjs → PHPにパラメータを渡してます。

■注意したこととか。

1.外部JSなので実行順に注意。

外部JSの実行順ってランダムなんですって、奥様ご存知でした?

アタクシすっかり忘れてましたわ、ヲホホホ☆

なので、js実行を制御させたいなら、when().done()で制御してやるといいかも。

結局自分はこれ使わなかった。

なぜかというと、JSでPHPにパラメータ渡してcokkieセットの一連の流れを処理させた後に、location.href=””つって、ヘッダー書き換えてやったんだけど、cookie書き込み後にlocation書き換えると、セットしたcookieが消えたからさ・・・

とりあえず、metaタグでジャンプさせる方法だとなぜかうまくいくので*1現状はその方法で。

あとは、ブラウザ毎の検証だねぇ・・・。

まず、IE8,9はXMLHttprequestだっけか、それが使えなかったはず。

jquery使ってしまえば、その辺は吸収してくれるんだっけ・・・?いかん、つい最近の出来事だったのに、もううろ覚えだよ。

あとは、そうそう、safariだなぁ。

iPhone、PCに限らず、ログイン先のサイトにBASIC認証がかかっている場合、先に別タブでBASIC認証だけ解除してやる必要があるみたい。

開発とか検証用の環境ではBASIC認証をかけてるところも多いと思う。

js使ってPHPに値を渡すときにもBASIC認証がきくので、とりあえずjsの呼び出し、あるいはJSからphpをたたくときに、BASIC認証に引っかからないようにしておくことが大事、かな。

ちなみに、上記の方法でsafariBASIC認証に引っかかっちゃうと、通信中のインジケーターがぐるぐる回りっぱなしになります。

以上、備忘録という割にすでに忘れてることも多いけど、記事更新終了。

適切に処理させないと、いろいろとセキュリティ的にやばそうなので、よいこはマネしないこと。


魔法陣グルグル フルサイズOP&ED集 - YouTube

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで

改訂新版 jQuery本格入門

改訂新版 jQuery本格入門

*1:その代り最低1秒は待たされるけど