[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のほうもハマりどころがあったら記事にします。
