hetemlでPHP OpenID Libraryを使うときの注意事項(mixi.jpの場合)

というか、hetemlでOpenIDでmixiを使うときにdiscoverに失敗するって例なんだけどね。
CakePHPのexamplesにある「discover.php」を使っても「discoverに失敗したお」エラーが出るので確認はできると思います。
2010050202

なお、今回はこの場合が該当します。

※Symfonyに関しては同等のライブラリ提供は無さげなので今回は割愛です。
なお、symfonyでOpenIDを実装してみた | ueblogで実装されているようです。

まあ、ぶっちゃけ解決策は「証明書インストールしる!」ってことです。
○mixiでログインできない件
きさら’s – 利用報告(heteml)
○証明書インストールの方法(root権限がない場合)
mixi OpenIDのサンプルコードをPHP OpenID Libraryを使って動かしてみた(訂正) – 大阪 本町で働くソーシャルアプリ開発者 ダイアリー

Auth_Yadis_ParanoidHTTPFetcher#get関数と、Auth_Yadis_ParanoidHTTPFetcher#post関数でcurl_exec関数を実行する直前の、132行目と196行目に下記のコードを追記

このへんを参照しました。
(1)まず、https://mixi.jp/ にアクセスして、証明書を保存する。
(2)保存した証明書をサーバへUPする。
(3)Yadisのソースで、cURLでアクセスしてる部分でcURLオプション(CURLOPT_CAINFO) を変更する。
ソース変更点は、こういうかんじになります。

--- old/Auth/Yadis/ParanoidHTTPFetcher.php	2009-04-21 11:31:20.000000000 +0900
+++ new/Auth/Yadis/ParanoidHTTPFetcher.php	2010-05-02 16:14:15.000000000 +0900
@@ -128,6 +128,12 @@
             curl_setopt($c, CURLOPT_TIMEOUT, $off);
             curl_setopt($c, CURLOPT_URL, $url);
 
+            if ( $this->isHTTPS( $url )  && mb_ereg( "mixi\.jp" , $url ) ) {
+                curl_setopt( 
+                        $c , 
+                        CURLOPT_CAINFO ,
+                        '/home/sites/heteml/users***/*/*/*/*/ssl/mixi.jp.crt' ) ;
+            }
             curl_exec($c);
 
             $code = curl_getinfo($c, CURLINFO_HTTP_CODE);
@@ -191,6 +197,12 @@
         curl_setopt($c, CURLOPT_URL, $url);
         curl_setopt($c, CURLOPT_WRITEFUNCTION,
                     array(&$this, "_writeData"));
+            if ( $this->isHTTPS( $url )  && mb_ereg( "mixi\.jp" , $url ) ) {
+                curl_setopt( 
+                        $c , 
+                        CURLOPT_CAINFO ,
+                        '/home/sites/heteml/users***/*/*/*/*/*/ssl/mixi.jp.crt' ) ;
+            }
 
         curl_exec($c);

これで、さっくり動きました。
あ、/home/sites〜に関しては各自のホームディレクトリと証明書のある場所を指定してください。

なお、証明書に関する件はFAQにも述べられています

※追記
mixi.jp 以外の場合に挙動がおかしくなるのでなおしました。
証明書が「ない」OP毎にこの処理を追加してあげる必要があります。

Comments are closed.