『CakePHP』で読んだ本メモを作る 〜1〜 はてな認証を使う

CakePHP』の基本的な部分はなんとなく理解してきたので、慣れていくために簡単なものを作ってみることに。
読んだ本を記録していくWebアプリを作る。

  • 本のデータは Amazon APIから取得
  • 認証は『はてな認証』を使ってみる

はてな認証apiの設定

まずは、はてな認証apiの説明を読む。


なんとなく動作は理解できた。
登録画面で、いろいろと設定項目を登録する。
コールバックURLっていうのがよくわからなかったけど、
はてな認証が返してきたデータを受け取るURLということでいいのかな。

ログイン用コントローラを作る

以下で提供されている PHP 用のライブラリを使わせてもらいました。

Services_JSON』が必要とのことなので以下からダウンロード。


『Hatena_API_Auth.php』と『JSON.php』を『vendors』ディレクトリにおいて、vendor()で呼び出して使う。
ただ、使うにあたって検索していたら、今後はvendor()が今後は使えなくなるという情報が掲載されていた。

いろいろと変わっていくなあ。とりあえず、今回は使ってしまう方向で。

共通で使う値を define する場所

APIキーと秘密鍵をどこかに define しておきたいのだけど、こういうのはどのファイルに書いておくのが正しいのだろうか?
わからなかったら検索、ということで調べていたら以下のサイトに説明があった。

  • CakePHP/defineはどこですればよい?

http://okumurya.homeip.net/pukiwiki/pukiwiki.php?CakePHP%2Fdefine%A4%CF%A4%C9%A4%B3%A4%C7%A4%B9%A4%EC%A4%D0%A4%E8%A4%A4%A1%A9

app/config/bootstrap.phpが初期化の最後に呼ばれるので、この中でごにょごにょするのがよいっぽいです。

なるほど。とりあえずここで define してしまう。
そしてコントローラ。

  • APP/controllers/login_controller.php
<?php
vendor('Json');
vendor('Hatena_API_Auth');

class LoginController extends AppController
{
	var $name = 'Login';
	var $uses = null;
	
	function index()
	{
		$hatena = new Hatena_API_Auth(HATENA_API_KEY, HATENA_SECRET_KEY);
		$login_uri = $hatena->uri_to_login();
		$this->set('login_uri', $login_uri);
	}

	function hatena()
	{
		$hatena = new Hatena_API_Auth(HATENA_API_KEY, HATENA_SECRET_KEY);
		$user = $hatena->login($this->params['url']['cert']);
		if($user)
		{
			$data = array(
				'name' => $user->name,
				'image' => $user->thumbnail_url
			);

			$this->Session->write('user', $data);
		}

		$this->redirect(FULL_BASE_URL);
		exit;
	}
}
?>

indexアクションでは、はてな認証用の URIを作成。

ここからはてなの認証サーバーにアクセスすると、認証の結果が以下のURLに返る。

認証が正しく行われたら、hatenaアクションの中でセッションにデータを保存してトップページにリダイレクトすることにしてみた。

ログイン用view

  • APP/views/login/index.thtml
<h3>ログイン</h3>

<p>データを登録するにはてな認証を使ってログインする必要があります。</p>

<ul>
<li><?php echo $html->link('はてなアカウントでログイン', $login_uri)?>
</ul>

<h3>はてなアカウント取得</h3>

はてなアカウントの取得は以下のページからどうぞ。

<ul>
<li><?php echo $html->link('はてなアカウントを取得', 'https://www.hatena.ne.jp/register')?>
</ul>

とりあえずこんなかんじで。
これでログインはできるようになった!

ログアウト コントローラ

ログアウトもできるように。

<?php
class LogoutController extends AppController
{
	var $name = 'Logout';
	var $uses = null;

	function index()
	{
		$this->Session->destroy();
		$this->redirect(FULL_BASE_URL);
		exit;
	}
}
?>