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

masa