サーバ側の認証処理をするクラス。
長いから全部は書かないけど。
<?php class AuthServer{ var 〜 function __construct(){ $this->header = apache_request_headers(); $this->input = file_get_contents('php://input'); $this->http_method = isset($this->header['HTTP_X_HTTP_METHOD_OVERRIDE']) ? $this->header['HTTP_X_HTTP_METHOD_OVERRIDE'] : @$_SERVER['REQUEST_METHOD']; } // Basicで認証 function basicAuth(){ 〜 } // Digestで認証 function digestAuth($realm=false,$algorithm=false,$qop=false){ 〜 } // WSSEで認証 function wsseAuth(){ 〜 } // OAuthで認証 function oauthAuth(){ 〜 } // 正しいパスワードを取得する function getValidPass($user,$type){ // 連想配列 if(isset($this->password[$user]) && is_array($this->password)){ return $this->password[$user]; // 文字列 }elseif(isset($this->password) && is_string($this->password)){ return $this->password; } } }
Digest認証
対応認証方式、前回書いた奴にDigest認証を追加した。
初めてDigest認証やった。
ちゃんとやろうとすると、ちょっとめんどくさい。
ヘッダーのパース部分が。
ソース量は、OAuthに次いで2番目。
OAuth認証 署名方式RSA-SHA1
OAuth RSA-SHA1を実装した。
RSAは他の認証方式と違って、サーバ側に生のパスワードがない。
クライアント側は、秘密鍵を使ってうまい事ハッシュしたパラメータをくっつけて送ってくる。
サーバ側は、その秘密鍵と対になった公開鍵をサーバ側に保持しておく。
その公開鍵と送られてきたパラメータを使って、秘密鍵が正しいかチェックするらしい。
パラメータは、basestringとoauth_signatureを使う。
oauth_signatureは、送られてきたものをそのまんまBase64でデコードしてバイナリに戻す。
basestringは、送られてきたパラメータを使って生成。
これはクライアント側で生成した時と全く一緒。
public_keyは公開鍵を文字列で。
↓部分抜き取りで見づらいけど、こんな感じ。
<?php $oauth_signature = $_GET['oauth_signature']; $basestring = $this->http_method.'&'.urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']).'&'.urlencode(http_build_query($auth_param)); $publickeyid = openssl_get_publickey($public_key); $ok = openssl_verify($basestring, base64_decode($oauth_signature), $publickeyid); openssl_free_key($publickeyid); return (bool)$ok;
getValidPass()は、xxxAuth()から呼ばれる。
userと対になったパスワードなり公開鍵なりを返す。
暫定的にこうなってるけど、classを継承してオーバーライドして使う予定。
データベースにuserで問い合わせたり。
一応、Basic認証とかをPHPだけで簡易的にやる時の為に作っておいた。
↓これだけで、面倒くさいサーバ側のOAuth認証部分が完成。
<?php $auth = new AuthServer(); $auth->password['testuser_hamc'] = 'testpass'; $auth->password['testuser_rsa'] = '--- 〜公開鍵〜 ---'; if($auth->oauthAuth()){ echo "認証成功!"; }else{ echo "認証失敗!"; }
oauthAuth()って、声に出して読むと、「おーおーすおーす」ですかね。
ネーミングセンスに問題があるのは、今に始まった事ではないので。
なんだか最近ずっと、寝るのが5時過ぎてる気が。
Tender Surrender » 検索結果: » OAuthの署名方式
http://devlog.agektmr.com/?s=OAuth%E3%81%AE%E7%BD%B2%E5%90%8D%E6%96%B9%E5%BC%8F
PHP: openssl_verify - Manual
http://us.php.net/manual/ja/function.openssl-verify.php
PHPでDigest(ダイジェスト)認証 ( しゃいん☆のブログ| 名古屋市 Webシステム開発 サーバ構築 ネットワーク構築 株式会社コネクティボ )
http://shain.blog.conextivo.com/2007/03/phpdigest.html