[FuelPHP]opAuthでFacebookログインでハマった件
FuelPHP1.7にてFacebookのソーシャルログインを実現する手順です。
すでに、いくつもの同じような解説ページはありましたが、
情報が古く、あまり参考になりませんでした。
ソーシャルログインに必要なopAuthをComposerインストールします
composer.jsonに以下のように追記
"require": { "php": ">=5.3.3", "composer/installers": "~1.0", "fuel/core": "1.8.*", "fuel/auth": "1.8.*", "opauth/opauth": "4.*", "opauth/facebook": "dev-master", },
新たに、opauth/opauth,opauth/facebookの二つをインストールします。
fuel/authパッケージをインストールしてない場合は、それも同時にインストールします。
ちなみに、Googleやtwitterなどのソーシャルログインもできます。
その場合は、下記のように新しいプラグインをインストールします(ここでは割愛)
"opauth/google": "dev-master", "opauth/twitter": "dev-master"
で、composerをupdateしてプラグインをインストールします
# php composer.phar update
authを読み込むために、/fuel/app/config/config.php
に設定を追記
'always_load' => array( 'packages' => array( 'auth', 'orm', ), ),
設定ファイル
/fuel/packages/auth/config/opauth.php
を/fuel/app/config/opauth.php
にコピーして設定を変更します
/** * A random string used for signing of auth response. * * You HAVE to set this value in your application config file! */ 'security_salt' => '任意の文字列をいれる', /** * Strategy * Refer to individual strategy's documentation on configuration requirements. */ 'Strategy' => array( 'Facebook' => array( 'app_id' => '{Facebookアプリのapp id}', 'app_secret' => '{Facebookアプリのシークレットキー}' ), ),
コントローラの作成
例として、member
コントローラのlogin
アクションでログインさせるとします。
class Controller_Member extends \Controller { public function action_login($provider = null){ if ($provider === null){ \Response::redirect_back(); } \Auth_Opauth::forge(); } public function action_callback(){ try{ $opauth = \Auth_Opauth::forge(false); $status = $opauth->login_or_register(); switch($status){ case 'linked': // 現在ローカルユーザでログイン済み // さらにFacebookユーザとの関連付け成功 break; case 'logged_in': // 現在ローカルユーザで未ログイン // しかしFacebookユーザとの関連付けが成功したので // そのローカルユーザでログイン break; case 'register': // ローカルユーザとFacebookユーザとの関連見つからず break; case 'registered': // ローカルユーザとFacebookユーザとの関連見つからず // しかしFacebookユーザ情報が十分だったため // それを元にローカルユーザを作成して関連付ける break; default: // 状態を判定できず } }catch(\OpauthException $e){ // 認証失敗 echo "認証失敗"; }catch(\OpauthCancelException $e){ // 認証失敗 echo "認証失敗"; } } }
action_login
には引数$provider
があることに注目してください。
これがないとダメなようです。
$provider
って何かというと、ここでソーシャルメディアを指定するようです。
つまり、facebookログインの場合は、
https://yourdomain.com/member/login/facebook/
このようなURLでアクセスするようです。
twitterなら https://yourdomain.com/member/login/twitter/
こんな感じ
アクセスしてみる→エラー
この時点で/login/member/facebook/にアクセスしてうまくいく場合
これ以降は読まなくて良いです
私はここからがハマりました。
Facebookアプリ側の設定
まず、アプリIDとアプリシークレットコードが正しいか確認
Facebook Developerサイトのアプリを選択し
[設定]⇒[ベーシック]⇒アプリIDとapp secretを確認してください。
アプリのウェブサイト側の情報を入れる
ついでにサイトのドメインや、利用規約的なページのURLも入れておきましょう。
リダイレクトURLを設定する
2018/08/31現在、ウェブサイトからFacebookログインする場合、呼び出し元のURLを全て申告する必要があるようです。
どこでやるかというと
[プロダクト]⇒[Facebookログイン]⇒[設定]の[有効なOAuthリダイレクトURI]
今回の場合、
https://yourdomain.com/member/login/facebook/
を登録しました。
そんでもって、https://yourdomain.com/member/login/facebook/をブラウザで開いてみます。
URLはブロックされています: リダイレクトURIがアプリのクライアントOAuth設 定でホワイトリストに追加されていないため、リダイレクトできませんでした。 クライアントとウェブOAuthログインをオンにして、すべてのアプリドメインを 有効なOAuthリダイレクトURIとして追加してください。
考えうる限りのURIをfacebookアプリに登録するもダメ。
結論ですが
/vender/opauth/facebook/FacebookStrategy.php
の27行目を見ると
public $defaults = array( 'redirect_uri' => '{complete_url_to_strategy}int_callback' );
URIにint_callbackという文字を付けてます。
つまり、facebookアプリに登録するURIは
https://yourdomain.com/member/login/facebook/int_callback
これを登録する必要があったわけです。
これで無事facebookログインが実装できました。
Twitterのほうもハマりどころがあったら記事にします。