Hatena::ブログ(Diary)

大阪で働くソーシャルゲームエンジニア ダイアリー このページをアンテナに追加 RSSフィード

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

mixiがとうとうOpenIDに対応しましたので、


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関数インストールされていないと認証出来ません。


という事でPHPにOpenSSL関数を追加。

./configureに--with-opensslを追加しました。


再度、STEP3まで実行。


またしても同様のエラーが、、、今回はYahooIDでのログインとは違いOpenSSL関数の追加だけでは駄目でした。


(ここから訂正)

原因はmixi.jpの証明書がインストールされていなかったためでした。


という事で、サーバーに証明書をインストールします。


使用ブラウザはFirefox3.0です。


STEP 4.証明書をダウンロード

1.ブラウザhttps://mixi.jp/にアクセス

f:id:botchy:20080826124549j:image


2.ステータスバー右にあるSSL(鍵)アイコンダブルクリック

f:id:botchy:20080826124550j:image


3.「証明書を表示」ボタンをクリック

f:id:botchy:20080826124551j:image


4.「詳細」タブをクリックし、エクスポートボタンをクリック

f:id:botchy:20080826124552j:image


5.ファイルの種類で、「証明書パスを含むX.509証明書(PEM)」を選択して保存

f:id:botchy:20080826124548j:image


6.証明書が作成される

mixi.jp.crtというファイルが作成されたのを確認してください。


STEP 5.サーバーに証明書をインストール(Linux)

サーバーへの証明書のインストールについて2パターン紹介致します。

一つはサーバーroot権限がある方向け、もう一つはサーバー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まで実行してください。


サーバーroot権限がない方>

1.mixi.jpの証明書をサーバーに保存

STEP4で作成したmixi.jp.crtサーバーに保存してください。

今回は、下記のパスに保存しました。

/var/ssl/mixi.jp.crt
2.PHP OpenID Libraryでmixi.jpの証明書を読み込ませる

PHP OpenID Libraryのソースを一部修正

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);
}


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


認証後は、ライブラリ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をご覧ください

参考にしたページ

cURL に HTTPS でアクセスできるように証明書を追加する

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。