◯ はじめに
CakePHP3でソーシャルログイン実装(4プロバイダ)しようとしたら、Railsに比べてプラグイン(Gem)がまったくなくて、絶望しながら調査したメモです。
CakePHP2で開発終わってる・・・
Opauth plugin for CakePHP2
◯ Opauthとは?!
Opauthは、RailsのOmniAuthに触発されて、PHPアプリケーションを複数プロバイダに対応したマルチ認証フレームワークです。
◯ Opauth 対応ログインプロバイダ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Bitbucket Disqus Do Facebook Flickr Foursquare GitHub Google Instagram LinkedIn (Windows) Live mixi OpenID PayPal Sina Weibo (新浪微博) Twitter VKontakte Yahoo! Japan LINE |
Opauthで大手のプロバイダは網羅可能。
また、各プロバイダ毎の戻り値の差分を吸収してくれる。
ex) 名(first_nameとして統一): given_nameが返ってきてもfirst_nameとしてパラメータ取得可能
◯ CakePHP3にOpauth実装メモ
CakePHP3用のプラグイン(Opauth)がなかったので、plain用を使う。
① Opauth本体ダウンロード
※ ダウンロードしたフォルダ中のlib配下「Opauth」フォルダをCakePHP3の「plugins」フォルダ配下にコピーする。
② 各プロバイダのファイルをOpauthトップページからダウンロード
※ Available strategiesのDownload「ZIP」をクリックする。
③ ②のダウンロードしたフォルダ名を変更し「plugins/Opauth/Strategy」フォルダ配下にコピー
※ Twitterの場合、フォルダ名「opauth-twitter-xxxxxxx」を「Twitter」に変更し、「plugins/Opauth/Strategy」フォルダ配下にコピーする。
④ 各プロバイダ毎のAPIキーファイル「plugins/Opauth/config.php」ファイル作成
※ ex) Yahoojp/ Facebook / Google / Twitter
※ 各プロバイダ毎のAPIキーセットする
★「Opauth」のサンプルフォルダ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <?php // 各プロバイダ毎のAPIキー $config = [ 'security_salt' => '2sBz1U5epdrtub6DQH26MfzhXAehaf1H55SRwTBu', // レスポンスのシグネチャ生成に使うソルト値(ランダム文字列) 'path' => '/auth/', 'callback_url' => '/auth/complete', // Opauthのソーシャルログイン処理完了後にリダイレクトするURL 'Strategy' => [ 'Yahoojp' => [ 'client_id' => 'xxx', 'client_secret' => 'xxx' ], 'Facebook' => [ 'app_id' => 'xxx', 'app_secret' => 'xxx', 'scope' => 'email', 'fields' => 'email,first_name,last_name,name' ], 'Google' => [ 'client_id' => 'xxx', 'client_secret' => 'xxx' ], 'Twitter' => [ 'key' => 'xxx', 'secret' => 'xxx' ] ] ]; |
⑤ CakePHP3にOpauth用のコントローラー作成「src/Controller/AuthController.php」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | <?php namespace App\Controller; use Cake\Controller\Controller; use Cake\Event\Event; // ソーシャルログイン用コントローラー class AuthController extends AppController { public function beforeFilter(Event $event) { parent::beforeFilter($event); // レイアウトなし $this->autoRender = FALSE; } // /auth/yahoojp public function yahoojp() { $this->authFunction(); } // /auth/facebook public function facebook() { $this->authFunction(); } // /auth/google public function google() { $this->authFunction(); } // /auth/twitter public function twitter() { $this->authFunction(); } // 共通function private function authFunction() { // Opauth require_once $opauth_path = '/var/www/html/cakephp3.com/plugins/Opauth/'; require_once $opauth_path.'config.php'; require_once $opauth_path.'Opauth.php'; // ソーシャルログイン処理 new \Opauth($config); } // ソーシャルログイン完了後のaction public function complete() { // session.auto_startオンやAuthなどでセッションスタート済みの場合不要 if (!isset($_SESSION['opauth'])) { session_start(); } // 取得データ表示 if (isset($_SESSION['opauth']['auth'])) { // 成功 // CakePHP ~3.4 $session = $this->request->session(); // CakePHP 3.5~ // $session = $this->request->getSession(); $session->write('opauth', $_SESSION['opauth']['auth']); var_dump($session->read('opauth')); } elseif (isset($_SESSION['opauth']['error'])) { // 失敗 var_dump($_SESSION['opauth']['error']); } else { // その他失敗 echo 'Opauth ERROR!'; } } } |
⑥「/auth/twitter」にアクセスし認証成功すると、Twitterからの取得情報が表示される
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 出力ログイメージ array (size=5) 'uid' => int 763583753xxxxxx 'info' => array (size=6) 'name' => string 'xxx' (length=16) 'nickname' => string 'xxx' (length=12) 'urls' => array (size=2) 'twitter' => string 'http://twitter.com/xxx' (length=31) 'website' => string 'https://t.co/xxx' (length=23) 'location' => string '日本' (length=6) 'description' => string 'xxx' (length=257) 'image' => string 'https://pbs.twimg.com/profile_images/763583753xxxxxx/xxx.jpg' (length=75) ・・・ |