2011年3月6日日曜日

[CakePHP] OpenID対応 (Mixi/Yahoo/はてな)

Open ID認証(Mixi/Yahoo/はてな)したメモ。
※AuthComponent連携なし

環境
CentOS 5.5(64bit)
PHP 5.1.6
cakePHP 1.3.7
OpenID component for CakePHP (2011-01-05)
→ PHP OpenID libraryが同胞されてます。
事前確認
OpenID component for CakePHPのデモサイトで、対象のOpenID認証が動作するか確認
1. curlとopensslがインストールされているか確認
 ※https://mixi.jp などSSL接続で必要
# curl --version
curl 7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Protocols: tftp ftp telnet dict ldap http file https ftps
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

# openssl version
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
2. OpenID component for CakePHP 設置
unzip cakebaker-openid-component-v2011-01-05-0-g872b8e5.zip
cd cakebaker-openid-component-cdbdeb1/
cp controllers/components/openid.php hogehoge/app/controllers/.
cp -r vendors/* hogehoge/app/vendors/.
3.ソースコード(サンプル)
var $components = array(
  'Openid' => array('use_database' => false, 'accept_google_apps' => false),
  'RequestHandler',
);

function login() {
  $realm = 'http://' . $_SERVER['HTTP_HOST'];
  $returnTo = $realm . '/users/login';
  if ($this->RequestHandler->isPost() && !$this->Openid->isOpenIDResponse()) {
    try {
      $this->Openid->authenticate($this->data['OpenidUrl']['openid'], $returnTo, $realm);
    } catch (InvalidArgumentException $e) {
      $this->set('error', 'Invalid OpenID');
    } catch (Exception $e) {
      $this->set('error', $e->getMessage());
    }
  } elseif ($this->Openid->isOpenIDResponse()) {
    $response = $this->Openid->getResponse($returnTo);
    if ($response->status == Auth_OpenID_CANCEL) {
      $this->set('error', 'Verification cancelled');
    } elseif ($response->status == Auth_OpenID_FAILURE) {
      $this->set('error', 'OpenID verification failed: '.$response->message);
    } elseif ($response->status == Auth_OpenID_SUCCESS) {
      echo 'successfully authenticated!';
      exit;
    }
  }
}
4. Apache再起動
# /etc/init.d/httpd restart

"Invalid OpenID" 等で動かない時は、デモサイトのソースコードを持ってきて確認する。

参考)
[OpenID component for CakePHP]
http://code.42dh.com/openid/

[OpenID component for CakePHP demo]
http://openid-example.42dh.com/

[cakebaker / openid-component-example]
https://github.com/cakebaker/openid-component-example

0 件のコメント: