0%

Laravel 5.2 Socialite

Reference:http://blog.damirmiladinov.com/laravel/laravel-5.2-socialite-facebook-login.html

.env
php artisan migrate
php artisan make:auth

composer require laravel/socialite

config/app.php
1
2
3
4
5
6
7
'providers' => [
// Other service providers...
Laravel\Socialite\SocialiteServiceProvider::class,
],
// alias
'Socialite' => Laravel\Socialite\Facades\Socialite::class,

申請APP
https://developers.facebook.com/apps
並註冊網址 http://localhost:8000/
到Dashboard找ID跟SECRET

config/services.php
1
2
3
4
5
'facebook' => [ // 用env() help function 不用加 單引號
'client_id' => env('FACEBOOK_ID'),
'client_secret' => env('FACEBOOK_SECRET'),
'redirect' => env('FACEBOOK_URL'),
],

env
1
2
3
FACEBOOK_ID=貼上
FACEBOOK_SECRET=貼上
FACEBOOK_URL=http://localhost:8000/callback

我們需要一些method
redirect our users to the facebook
handle callback from facebook
So,
php artisan make:controller SocialAuthController
Add two methods redirect() and callback()

routes.php
1
2
Route::get('/redirect', 'SocialAuthController@redirect');
Route::get('/callback', 'SocialAuthController@callback');

FB登入鍵

resources/views/auth/login.blade.php
1
<a href="redirect">FB Login</a>

SocialAuthController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Socialite;
class SocialAuthController extends Controller
{
public function redirect()
{
return Socialite::driver('facebook')->redirect();
}
public function callback()
{
// when facebook call us a with token
}
}
SocialAuthController@callback
1
2
3
4
5
use Socialite;
$providerUser = Socialite::driver('facebook')->user();
提供許多method取得使用者資料
getId(), getNickname(), getName(), getEmail(), getAvatar()
例如: dd($providerUser->getEmail());

到這邊已經完成FB登入功能了,現在只要合併FB users到資料庫中!

有些社群網站沒用Email
所以將email欄位設成可null $table->string('email')->unique()->nullable();

資料表跟Model
php artisan make:migration create_social_accounts_table --create="social_accounts"
php artisan make:model SocialAccount

create_social_accounts_table
1
2
3
4
5
6
Schema::table('social_accounts', function (Blueprint $table) {
$table->integer('user_id');
$table->string('provider_user_id'); // fb的userid
$table->string('provider'); // 可以是 fb google github 等等
$table->timestamps();
});

php artisan migrate:refresh

SocialAccount.php
1
2
3
4
5
protected $fillable = ['user_id', 'provider_user_id', 'provider'];
public function user()
{
return $this->belongsTo(User::class);
}

建立一個service : 註冊 或 登入已存在的使用者

app/SocialAccountService.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
<?php
namespace App;
use Laravel\Socialite\Contracts\User as ProviderUser;
class SocialAccountService
{
public function createOrGetUser(ProviderUser $providerUser)
{
$account = SocialAccount::whereProvider('facebook')
->whereProviderUserId($providerUser->getId())
->first();
if ($account) {
return $account->user;
} else {
$account = new SocialAccount([
'provider_user_id' => $providerUser->getId(),
'provider' => 'facebook'
]);
$user = User::whereEmail($providerUser->getEmail())->first();
if (!$user) {
$user = User::create([
'email' => $providerUser->getEmail(),
'name' => $providerUser->getName(),
]);
}
$account->user()->associate($user);
$account->save();
return $user;
}
}
}

This will try to find provider’s account in the system and if it is not present it will create new user. This method will also try to associate social account with the email address in case that user already has an account.

最後controller該長這樣

SocialAuthController
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
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use App\SocialAccountService;
use Socialite;
class SocialAuthController extends Controller
{
public function redirect()
{
return Socialite::driver('facebook')->redirect();
}
public function callback(SocialAccountService $service)
{
$user = $service->createOrGetUser(Socialite::driver('facebook')->user());
auth()->login($user);
return redirect()->to('/home');
}
}

以上是以FB登入時會檢查email是否已註冊,有的話關聯上去,沒的話新建
這篇也很棒 單純FB登入:http://goodheads.io/2015/08/24/using-facebook-authentication-for-login-in-laravel-5/
https://mattstauffer.co/blog/using-github-authentication-for-login-with-laravel-socialite