讓 laravel 5 連結 facebook 登入(使用 socialite )


為使用 laravel 的網站接上 facebook login,無論是使用官方的 php sdk,還是用另一個比較有名的第三方套件,都無法成功接上,出現了如下面的錯誤。

Cross-site request forgery validation failed. The "state" param from the URL and session do not match.
Facebook SDK returned an error: Cross-site request forgery validation failed. Required param "state" missing from persistent data.
(應該是 session 問題,把 laravel 的 session 打開可以解決)

Graph returned an error: Invalid redirect_uri: 無法載入網址
Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request
(明明有設定 redirect_uri ,沒有使用 laravel 的情況下也是成功的,原因不明)

最後,在面對失敗了好多次之後,忽然發現原來 laravel 有提供官方的 socialite 套件,一試,終於成功了!

使用方法如下:

首先,安裝 socialite
composer require laravel/socialite

修改 config/app.php,在 providers 中,加上
Laravel\Socialite\SocialiteServiceProvider::class,

以及在 aliases 中,加上
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

然後,要設定它,到 config/services.php 中,加上
'facebook' => [
 'client_id' => '你的 app id',
 'client_secret' => '你的 app secret',
 'redirect' => 'facebook 處理完成後,要導回到你網址的那個網址絕對路徑,例如 http://example.com/facebook/callback',
],

確保你的 facebook app 有安裝及啟用 Facebook login 功能。


然後到 Facebook Login 中,設定你應用程式的 Valid OAuth redirect URIs  ,你要輸入絕對路徑,例如 http://example.com/facebook/callback 。



設定完成了,現在就寫程式,試試用它來登入吧,在這個例子中,我要求了 email 權限,如果你不需要,把它拿走就可以了。

如果要讓大家都可以使用,記得幫你應用程式的 Facebook Login 功能申請審批。

回到我們的 laravel 了,在 app/Http/routes.php 中,加上
Route::get('/facebook/link', function() {
 return Socialite::driver('facebook')
            ->scopes(['email'])->redirect();
});

Route::get('/facebook/callback', function() {
 $user = Socialite::driver('facebook')->user();
 var_dump($user);
});

完成了,現在到 /facebook/link,是不是看到從 facebook 來的資料了呢?

object(Laravel\Socialite\Two\User)#184 (10) {
  ["token"]=>
  string(165) "不告訴你 :p"
  ["refreshToken"]=>
  NULL
  ["expiresIn"]=>
  string(7) "5184000"
  ["id"]=>
  string(17) "不告訴你 :p"
  ["nickname"]=>
  NULL
  ["name"]=>
  string(8) "Toby Lam"
  ["email"]=>
  string(13) "自己查"
  ["avatar"]=>
  string(69) "https://graph.facebook.com/v2.6/不告訴你 :p/picture?type=normal"
  ["user"]=>
  array(5) {
    ["name"]=>
    string(8) "Toby Lam"
    ["email"]=>
    string(13) "自己查"
    ["gender"]=>
    string(4) "male"
    ["verified"]=>
    bool(true)
    ["id"]=>
    string(17) "不告訴你 :p"
  }
  ["avatar_original"]=>
  string(68) "https://graph.facebook.com/v2.6/不告訴你 :p/picture?width=1920"
}

留言

這個網誌中的熱門文章

如何在ubuntu中compile kernel(12.10)

如何在linux kernel 3.7中加入system call