AuthServerっていうクラスを作ってみた

サーバ側の認証処理をするクラス。
長いから全部は書かないけど。
 

<?php
class AuthServer{
	varfunction __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