CakePHP 2.xにTwitterやFacebook等の認証を実装できるプラグイン「CakePHP plugin for Opauth」でGoogle認証

Bookmark this on Google Bookmarks
LINEで送る
Pocket

– 前提 –

  • Google APIs Consoleにアプリケーションを登録してapp_idとapp_secretを取得しておく。コールバック用のURIは下記のように設定する。(Google用のStrategy内のREADMEに書いてある)
  • modelやviewは自分で適当に用意する。
  • gitを使っている前提で説明が書かれているのでgitを使った方が良さげ。(gitでインストールすれば想定しているディレクトリに関連ファイルを入れてくれる)

READMEの”How to use” に、Facebookで認証するサンプルが書かれているので、Facebook向けの記述を下記のようにGoogle用に書き換える。(Google以外の対応サービス一覧

CakePHP plugin for Opauth
https://github.com/uzyn/cakephp-opauth

<!--?php CakePlugin::load('Opauth', array('routes' =--> true, 'bootstrap' =&gt; true));

// Using Facebook strategy as an example
Configure::write('Opauth.Strategy.Facebook', array(
'app_id' => 'YOUR FACEBOOK APP ID',
'app_secret' => 'YOUR FACEBOOK APP SECRET'
));

Google認証するには、ここを以下のように書く。

<!--?php CakePlugin::load('Opauth', array('routes' =--> true, 'bootstrap' =&gt; true));

// Using Google strategy as an example
Configure::write('Opauth.Strategy.Google', array(
'client_id' => 'YOUR CLIENT ID',
'client_secret' => 'YOUR CLIENT SECRET'
));

Plugin内のStrategyディレクトリにGoogle用のStrategyを入れる

cd path_to_opauth/Strategy
git clone git://github.com/uzyn/opauth-google.git Google

コールバック用のパスは以下のように設定
(Google APIs ConsoleのRedirect URIsに以下を設定する)

http://path_to_opauth/google/oauth2callback

Google認証するには下記にアクセスする

http://path_to_your_cake_app/auth/google

 

– 追記 –
YouTube APIを使いたい場合は、上記のStrategyの設定にscopeを追加してYouTubeのURLを加える。
以下は、デフォルトのscopeにYouTubeのURLを加えている。

'scope' => 'https://gdata.youtube.com https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email'

– 追記 –
各コントローラではなく、AppController.phpにSecurityコンポーネントを読み込む設定を書いている場合、Opauthのコールバック時にセキュリティチェックに引っかかってしまう。

デフォルトの設定だと、Oauth認証後にOpauthのcallbackアクションで/users/opauth_complete/に飛ぶ、この時、データをPOSTで受け渡ししているので、SecurityComponentのチェックで引っかかる。

ひとまず、下記のSecurity部分を足すとチェックを回避できる。
OpauthController.php

<?php
class OpauthController extends OpauthAppController {
	public function beforeFilter() {
		// Allow access to Opauth methods for users of AuthComponent
		if (is_object($this->Auth) && method_exists($this->Auth, 'allow')) {
			$this->Auth->allow();
		}
        if (is_object($this->Security)) {
            $this->Security->validatePost = false; //改竄対応
            $this->Security->csrfCheck = false;    //CSRF対応
        }
	}
}