試しに、PHP で RP(Relying Party)サイトを作ってみたかったので、Janrain OpenID Libraries を取得し、その中の examples/consumer 以下のサンプルプログラムを使って構築してみた。
で、少々ハマったのでメモしとく。
まず、
Fatal error: Call-time pass-by-reference has been removed in /DocumentRoot/Auth/OpenID/Consumer.php on line 1184
というエラーが出る。
どうも、5.3系では「関数コール時に引数が参照で渡されたら警告を出す」という動きを強制的に ON(有効)にしとかないと駄目みたいね。「参照渡し」は許さないということのようだ。
php.iniの allow_call_time_pass_reference の部分を、
;allow_call_time_pass_reference = Offallow_call_time_pass_reference = On
という具合に(Off→Onに)修正した。
次に、うちの PHP は OpenSSL エクステンションが有効になってなかった。
これ、OpenID のサンプルプログラムの中から OP へのアクセスに SSL を使用するため(例:https://mixi.jp)、有効になってないと駄目。
ということで、configure の引数に --with-openssl を指定して再 make を行った。(この際、バージョンも 5.3.6 から、5.3.26 に上げた)
で、ここまやってもまだ try_auth.php を実行すると Authentication error; not a valid OpenID. というエラーが・・・
これは結局、mixi.jp の証明書がサーバにインストールされていないことが原因。
ブラウザで https://mixi.jp にアクセスし、証明書情報を表示し「エクスポート」した内容をサーバ上の証明書ファイルに追加してやる。
例えば、Forefox で証明書情報をエクスポートすると mixi.jp.crt という名前のファイルで保存されるので、その内容を、
cat >> /etc/pki/tls/certs/ca-bundle.crt
として、ca-bundle.crt の後ろに追加してやる。
以上で、index.php 上で「https://mixi.jp」を Identity URL に入力して Verify ボタンを押せば https://mixi.jp/openid_server.pl に飛び、認証が済めば指定したサイト(finish_auth.php)に帰ってくるところまで確認した。
コメントする