2008-08-20 mixi OpenIDのサンプルコードをPHP OpenID Libraryで動かしてみた
mixi OpenIDのサンプルコードをPHP OpenID Libraryを使って動かしてみた(訂正)
※mixiコミュで誤りをご指摘頂いていたみたいなので、内容を修正致しました。
ミクシィは8月20日、オープンな分散認証技術「OpenID」とソーシャルネットワーキングサービス(SNS)「mixi」を融合した認証サービス「mixi OpenID」を同日15時に提供開始することを発表した。
ミクシィ、認証サービス「mixi OpenID」を提供--「mixi Platform」第1弾:ニュース - CNET Japan
PHP OpenID Libraryを利用してmixi OpenIDでログインするサンプルプログラムを動かしてみました。
以下の手順をご覧ください。
STEP 1.インストール
特に難しい設定は必要ありません。
cd /var/www wget http://openidenabled.com/files/php-openid/packages/php-openid-2.1.1.tar.bz2 tar jxvf php-openid-2.1.1.tar.bz2
STEP 2.解凍したページにアクセス。
http://example.com/php-openid-2.1.1/examples/consumer/

STEP 3.Identity URLを入力
「mixi.jp」と入力しVerifyボタンをクリック


「Authentication error; not a valid OpenID.」
ログイン出来ませんね
以前のエントリー「YahooIDでOpenID2.0ログインのサンプルコードを動かしてみたComments」と同様にmixiではSSL通信(https)を利用するため、、PHPにOpenSSL関数がインストールされていないと認証出来ません。
./configureに--with-opensslを追加しました。
再度、STEP3まで実行。

またしても同様のエラーが、、、今回はYahooIDでのログインとは違いOpenSSL関数の追加だけでは駄目でした。
(ここから訂正)
原因はmixi.jpの証明書がインストールされていなかったためでした。
使用ブラウザはFirefox3.0です。
STEP 4.証明書をダウンロード
1.ブラウザでhttps://mixi.jp/にアクセス
2.ステータスバー右にあるSSL(鍵)アイコンをダブルクリック
3.「証明書を表示」ボタンをクリック
4.「詳細」タブをクリックし、エクスポートボタンをクリック
5.ファイルの種類で、「証明書パスを含むX.509証明書(PEM)」を選択して保存
6.証明書が作成される
mixi.jp.crtというファイルが作成されたのを確認してください。
STEP 5.サーバーに証明書をインストール(Linux)
サーバーへの証明書のインストールについて2パターン紹介致します。
一つはサーバーのroot権限がある方向け、もう一つはサーバーのroot権限がない方向けです。
1.mixi.jpの証明書をサーバーに保存
STEP4で作成したmixi.jp.crtをサーバーに保存してください。
今回は、下記のパスに保存しました。
/tmp/mixi.jp.crt
2.既存の証明書ファイルを探す
既存の証明書ファイル「ca-bundle.crt」を探します。
ca-bundle.crtファイルの場所はOS、バージョンによって事なります。
私が確認したのは、
CentOS4.5の場合
/usr/share/ssl/certs/ca-bundle.crt
CentOS5.2の場合
/etc/pki/tls/certs/ca-bundle.crt
FreeBSDの場合
ちなみにFreeBSDの場合は
下記のファイルになるようです。
/usr/local/share/curl/curl-ca-bundle.crt
ca-bundle.crtの場所が分からない方は、下記コマンドにて探せると思います。
find /usr/ -name "libcurl.so*" -type f|head -n 1|xargs strings|grep ca-bundle.crt
3.証明書ファイルにmixi.jpの証明書を追加
ca-bundle.crtファイルにmixi.jp.crtの内容を追加
cat /tmp/mixi.jp.crt >> /usr/share/ssl/certs/ca-bundle.crt
これで証明書のインストール完了。
再度、STEP3まで実行してください。
1.mixi.jpの証明書をサーバーに保存
STEP4で作成したmixi.jp.crtをサーバーに保存してください。
今回は、下記のパスに保存しました。
/var/ssl/mixi.jp.crt
2.PHP OpenID Libraryでmixi.jpの証明書を読み込ませる
vi /var/www/php-openid-2.1.1/Auth/Yadis/ParanoidHTTPFetcher.php
Auth_Yadis_ParanoidHTTPFetcher#get関数と、Auth_Yadis_ParanoidHTTPFetcher#post関数でcurl_exec関数を実行する直前の、132行目と196行目に下記のコードを追記
if ($this->isHTTPS($url)) {
curl_setopt($c, CURLOPT_CAINFO, '/var/ssl/mixi.jp.crt');
}
証明書の設定は完了です。
再度、STEP3まで実行してください。
ソースを解析、、、、、
原因はPHP OpenID Library内部でcurl関数でダウンロードを行う箇所があるのですが、そこでのSSL通信に対応していなかったため、エラーとなっていました。
今回は問題の箇所を一部修正する事で対応しました。
vi /var/www/php-openid-2.1.1/Auth/Yadis/ParanoidHTTPFetcher.php
Auth_Yadis_ParanoidHTTPFetcher#get関数と、Auth_Yadis_ParanoidHTTPFetcher#post関数でcurl_exec関数を実行する直前の、132行目と196行目に下記のコードを追記
if ($this->isHTTPS($url)) {
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
}

mixiのOpenID認証画面にリダイレクトされ、無事認証が成功しました。

認証後は、ライブラリにmixiから受け取ったOpenIDが格納されているので、それを使って処理を進めていくという事になります。
Identity URLに下記のようなOP Identifierを入力する事で、「ミクシィ認証」「マイミクシィ認証」「コミュニティ認証」の認証方式を試す事が出来ます。
https://mixi.jp/ https://id.mixi.jp/[ユーザー ID]/friends https://id.mixi.jp/community/[コミュニティ ID] https://id.mixi.jp/[ユーザー ID]
OP Identifierについてはmixi Developer Centerをご覧ください
参考にしたページ
- Rogi073.Diary - PHPで mixi OpenID
- [PHP][openid]mixiIDとcurl_setoptのCURLOPT_CAINFO
- みずましにっき(無調整) - OpenIDで認証するときにつまづいたいくつ...
- プログラミングを始める10の理由 - OpenID、わりと簡単。
- mk18のプログラミング日記 - PHP、mixiのopenIDを使用して認証
- mk18のプログラミング日記 - [php][openid]
- ihiro81の日記 - mixi の openid でログインできなくなった。
- PHP,MySQL,Flexな日々+イラストとか - OpenIDを使ってみたのでメモ
- 243 inari - OpenIDを試してみる2
- Cheese Pie - PHP OpenID Libraryこと始め
- bushimichiの日記 - OpenIDでmixi id を利用する時の備忘録
- bushimichiの日記 - OpenIDでmixi id を利用する時には証明書が2つ...
- A.C.Milan好きの皮相浅薄な独り言 - PHPで簡単にOpenIDを実装できそ...












