SQLの窓 イラストAC フリー素材

2012年12月03日

ログイン画面からリダイレクトしてアクセストークンを取得するまでの簡単な PHP コード

実用にはなりませんが、とりあえずいろいろテストするのに、Facebook や Google だと時間がかかってしょうがないのです。まあ、こんなものでも PHP 的なコードは結構満載なので、学生の修行ツールにはなります。

エラーメッセージについて、イントラネットの場合はユーザができる限り最短時間で処理できる事を考えますが、一般の WEB の場合セキュリティの意味から、ユーザが存在する事を明示する事を避ける為に、『ユーザまたはパスワードが正しくありません』とするのが良いと思います。
<?
session_start();

//$_SESSION['login'] = '';
//$_SESSION['client_id'] = '';

$login_script = 'http://localhost/lightbox/work/api/login.php';

// 入力では無い
if ( $_SERVER['REQUEST_METHOD'] == 'GET' ) {
	// ログインされていない
	if ( $_SESSION['login'] != 'yes' ) {
		// アプリケーション ID が指定されていない
		if ( $_GET['client_id'] != 'abcdefg0123456789' ) {
			// エラーによるリダイレクトでは無い
			if ( $_GET['er'] != '000' ) {
				// エラーコード 000 でリダイレクト
				header("Location: {$login_script}?er=000");
				exit();
			}
		}
	}
	// ログインされている
	else {
		// ログイン時のアプリ ID と一致しない
		if ( $_GET['client_id'] != $_SESSION['client_id'] ) {
			// ログアウトする
			$_SESSION['login'] = '';
			$_SESSION['client_id'] = '';
			// エラーコード 000 でリダイレクト
			header("Location: {$login_script}?er=000");
			exit();
		}
	}
}

// 入力である
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
	if ( $_SESSION['login'] != 'yes' ) {
		// ユーザが正しく無い
		// 一般 WEB では、この場合のメッセージは、『ユーザまたはパスワードが正しくありません』とする
		if ( $_POST['login_user'] != 'lightbox' ) {
			header("Location: {$login_script}?er=001&client_id={$_GET['client_id']}");
			exit();
		}
		// パスワードが一致しない
		// 一般 WEB では、この場合のメッセージは、『ユーザまたはパスワードが正しくありません』とする
		if ( hash_hmac('sha256', $_POST['login_pass'], "r101" ) != 'aba283b0fece03ad2e0394cdbd6d163a2c45bbdb3b3697979e8f3c0fde3e939d' ) {
			header("Location: {$login_script}?er=002&client_id={$_GET['client_id']}");
			exit();
		}
	
		// ログイン終了
		$_SESSION['login'] = 'yes';
		$_SESSION['client_id'] = $_GET['client_id'];
		// アプリケーション ID を引き渡して『許可画面』に遷移する
		header("Location: {$login_script}?client_id={$_GET['client_id']}");

	}
}

// ログインしている
if ( $_SESSION['login'] == 'yes' ) {
	// アプリ ID がある
	if ( $_SESSION['client_id'] != '' ) {
		// 許可ボタンを押した
		if ( $_POST['allow_button'] != '' ) {
			header("Location: {$login_script}?access_token=アクセストークン&client_id={$_GET['client_id']}");
		}
	}
}


?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>API ログイン</title>
</head>
<body>
<?
if ( $_GET['er'] != '' ) {
	if ( $_GET['er'] == '000' ) {
		print '<span style="color:red;font-weight:bold;">処理できません</span>';
	}
	if ( $_GET['er'] == '001' ) {
		print '<span style="color:red;font-weight:bold;">ユーザが正しくありません</span>';
	}
	if ( $_GET['er'] == '002' ) {
		print '<span style="color:red;font-weight:bold;">パスワードが正しくありません</span>';
	}
}
if ( $_SESSION['login'] != 'yes' ) {
	require_once('pass_1.php');
}
else {
	if ( $_SESSION['client_id'] != '' ) {

		if ( $_GET['access_token'] != '' ) {
			print "アクセストークン処理完了";
		}
		else {
			// 許可ホタンを押す前
			require_once('pass_2.php');
		}

	}
}

?>
<pre>
<? //print_r($_SESSION)  ?>
</pre>

</body>
</html>

パスワードは、aba283b0fece03ad2e0394cdbd6d163a2c45bbdb3b3697979e8f3c0fde3e939d を変えて埋め込みます。実際のパスワードを埋め込む必要の無い書き方ですが、hash_hmac を使わないでインターネットに貼ってしまうと、辞書があると逆引きできてしまうので注意です(パスワードがバレます)。

以下、画面定義
<!-- ログインフォーム -->
<form method="post">
ユーザ <input name="login_user" type="text"/> <br />
パスワード  <input name="login_pass" type="password"/> <br />
<input name="login_button" type="submit" value="ログイン"/> <br />
</form>

<!-- 許可フォーム -->
<form method="post">
<input name="allow_button" type="submit" value="許可する"/> <br />
</form>

pass_1.php と pass_2.php です。


タグ:PHP
【PHPの最新記事】
posted by at 2012-12-03 13:22 | PHP | このブログの読者になる | 更新情報をチェックする