در این پست بهتون میگم چطور از پکیج Socialite استفاده کنین و به وبسایتتون لاگین با جیمیل یا… رو اضافه کنین. برای شروع نیازه که ما پکیج Socialite رو بوسیله composer نصب کنیم. راهنمای خود لاراول رو اینجا ببینین: Laravel Socialite
نصب Socialite
composer require laravel/socialite
کانفیک لاراول
سرویسی که میخواین (گوگل، فیسبوک، لینکداین و…) رو به config/service.php اضافه کنین.
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect' => env('GOOGLE_REDIRECT')
],
بعد اینکه پکیج جدید رو نصب کردیم سرویس پرووایدر اون رو هم به config/app.php اضافه میکنیم
/*
* Package Service Providers...
*/
Laravel\Socialite\SocialiteServiceProvider::class,
سرویس پرووایدر جایی برای راه انداری برنامه ها و پکیج هاست، خط بالا به لاراول Socialite رو برای استفاده میشناسونه.
همیشه پای یک alias هم در میونه! برای دسترسی راحتتر آلیاس اون رو هم نصب میکنیم.
'aliases' => [
// ...
'Socialite' => Laravel\Socialite\Facades\Socialite::class,
]
تا اینجا شما میبایست ساختار اهراز هویت رو داشته باشید و در این آموزش تصور میکنیم این مرحله رو قبلا انجام دادین.
پروژه خودتون رو در گوگل https://console.developers.google.com/projectcreate درست کنین و بعد هم یک اعتبار نامه در اینجا https://console.developers.google.com/apis/credentials درست کنین.
OAuth client ID > Consent > Web application
اطلاعاتی که گرفتین رو در .env فایل خودتون وارد کنین:
GOOGLE_CLIENT_ID=000000000000-XXXXXXXXXXX.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=XXXXXXXXXXXXX
GOOGLE_REDIRECT=http://localhost:8000/callback
در اینجا باید آدرس کالبک رو وارد کنین.
بعد وارد کردن این آدرس ها وارد وب روت خود بشین و روت های مخصوص ریدارکت به گوگل و بازگشت اون رو ایجاد کنین.
Route::get('/redirect', 'Auth\LoginController@redirectToProvider');
Route::get('/callback', 'Auth\LoginController@handleProviderCallback');
در خط اول رواتی (یا روتی) رو تعریف میکنیم که کاربر رو به گوگل میفرسته و خط دوم برگشت از گوگل با دریافت اطلاعات کاربر هست. حالا در LoginController.php متد هایی که تو روات تعریف کردیم رو وارد میکنیم. متد زیر مارو به گوگل ریدایرکت میکنه برای گرفتن اطلاعات کاربر.
/**
* Redirect the user to the Google authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('google')->redirect();
}
و متد بعدی دریافت اطلاعات کاربر از گوگل هست (برگشت از گوگل) که اگر ایمیل قبلا وجود داشته، ثبت نام انجام میشه و اگر وجود نداشته باشه ما اون کاربر رو ایجاد میکنیم و سپس لاگین انجام میشه:
/** * Obtain the user information from Google. * * @return \Illuminate\Http\Response */ public function handleProviderCallback() { try { $user = Socialite::driver('google')->user(); } catch (\Exception $e) { return redirect('/login'); } // only allow people with @company.com to login if(explode("@", $user->email)[1] !== 'company.com'){ return redirect()->to('/'); } // check if they're an existing user $existingUser = User::where('email', $user->email)->first(); if($existingUser){ // log them in auth()->login($existingUser, true); } else { // create a new user $newUser = new User; $newUser->name = $user->name; $newUser->email = $user->email; $newUser->google_id = $user->id; $newUser->avatar = $user->avatar; $newUser->avatar_original = $user->avatar_original; $newUser->save(); auth()->login($newUser, true); } return redirect()->to('/home'); }
خب تا اینجای کار شما همه کارو انجام دادین فقط بعد اینکه پکیجی رو نصب کردین حتما دامپ کنین:
php artisan clear-compiled composer dump-autoload php artisan optimize
اگر خواستین از آدرس های مختلفی برای کالبک استفاده کنین دستور زیر کمکتون میکنه
public function socialLogin($loginFrom){
return Socialite::driver('google') >redirectUrl('http://your-domain.com?data=123')->redirect();
}
منابع:
Add Login with Google to your Laravel app
Laravel 5.5 socialite integration shows error formatRedirectUrl() must be of the type array, null given
Dynamic callback url laravel socialite
سلام
همه مطالبی که گفتین رو اجرا کردم ولی بعد از ریدارکت از گوگل، $user رو null بر می گرداند , ضمنا پورت ۸۰۰۰ که روی لوکال اجرا نمیشه اینو بایستی چیکار کرد.
ممنون.