در این پست بهتون میگم چطور از پکیج Socialite استفاده کنین و به وبسایتتون لاگین با جیمیل یا… رو اضافه کنین. برای شروع نیازه که ما پکیج Socialite رو بوسیله composer نصب کنیم. راهنمای خود لاراول رو اینجا ببینین: Laravel Socialite
نصب Socialite
1 |
composer require laravel/socialite |
کانفیک لاراول
سرویسی که میخواین (گوگل، فیسبوک، لینکداین و…) رو به config/service.php اضافه کنین.
1 2 3 4 5 |
<span id="903d" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph="">'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), 'redirect' => env('GOOGLE_REDIRECT') ],</span> |
بعد اینکه پکیج جدید رو نصب کردیم سرویس پرووایدر اون رو هم به config/app.php اضافه میکنیم
1 2 3 4 |
<span id="7b4e" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph="">/* * Package Service Providers... */ Laravel\Socialite\SocialiteServiceProvider::class,</span> |
سرویس پرووایدر جایی برای راه انداری برنامه ها و پکیج هاست، خط بالا به لاراول Socialite رو برای استفاده میشناسونه.
همیشه پای یک alias هم در میونه! برای دسترسی راحتتر آلیاس اون رو هم نصب میکنیم.
1 2 3 4 |
<span id="eb0e" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph="">'aliases' => [ // ... 'Socialite' => Laravel\Socialite\Facades\Socialite::class, ]</span> |
تا اینجا شما میبایست ساختار اهراز هویت رو داشته باشید و در این آموزش تصور میکنیم این مرحله رو قبلا انجام دادین.
پروژه خودتون رو در گوگل https://console.developers.google.com/projectcreate درست کنین و بعد هم یک اعتبار نامه در اینجا https://console.developers.google.com/apis/credentials درست کنین.
OAuth client ID > Consent > Web application
اطلاعاتی که گرفتین رو در .env فایل خودتون وارد کنین:
1 2 3 |
<span id="dd72" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph="">GOOGLE_CLIENT_ID=000000000000-XXXXXXXXXXX.apps.googleusercontent.com GOOGLE_CLIENT_SECRET=XXXXXXXXXXXXX GOOGLE_REDIRECT=<a class="er cf gm gn go gp" href="http://localhost:8000/callback" target="_blank" rel="noopener noreferrer">http://localhost:8000/callback</a></span> |
در اینجا باید آدرس کالبک رو وارد کنین.
بعد وارد کردن این آدرس ها وارد وب روت خود بشین و روت های مخصوص ریدارکت به گوگل و بازگشت اون رو ایجاد کنین.
1 2 |
<span id="7c27" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph=""><mark class="ws ra kd">Route::get('/redirect', 'Auth\LoginController@redirectToProvider'); Route::get('/callback', 'Auth\LoginController@handleProviderCallback');</mark></span> |
در خط اول رواتی (یا روتی) رو تعریف میکنیم که کاربر رو به گوگل میفرسته و خط دوم برگشت از گوگل با دریافت اطلاعات کاربر هست. حالا در LoginController.php متد هایی که تو روات تعریف کردیم رو وارد میکنیم. متد زیر مارو به گوگل ریدایرکت میکنه برای گرفتن اطلاعات کاربر.
1 2 3 4 5 6 7 8 9 |
<span id="5a6d" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph="">/** * Redirect the user to the Google authentication page. * * <a class="er cf gm gn go gp" href="http://twitter.com/return" target="_blank" rel="noopener noreferrer">@return</a> \Illuminate\Http\Response */ public function redirectToProvider() { return Socialite::driver('google')->redirect(); }</span> |
و متد بعدی دریافت اطلاعات کاربر از گوگل هست (برگشت از گوگل) که اگر ایمیل قبلا وجود داشته، ثبت نام انجام میشه و اگر وجود نداشته باشه ما اون کاربر رو ایجاد میکنیم و سپس لاگین انجام میشه:
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 |
<span id="4386" class="he hf dt ba ia b el ib ic r id" data-selectable-paragraph=""> /** * Obtain the user information from Google. * * <a class="er cf gm gn go gp" href="http://twitter.com/return" target="_blank" rel="noopener noreferrer">@return</a> \Illuminate\Http\Response */ public function handleProviderCallback() { try { $user = Socialite::driver('google')->user(); } catch (\Exception $e) { return redirect('/login'); }</span><span id="b9e0" class="he hf dt ba ia b el iu iv iw ix iy ic r id" data-selectable-paragraph=""> // only allow people with @company.com to login if(explode("@", $user->email)[1] !== 'company.com'){ return redirect()->to('/'); }</span><span id="081c" class="he hf dt ba ia b el iu iv iw ix iy ic r id" data-selectable-paragraph=""> // check if they're an existing user $existingUser = User::where('email', $user->email)->first();</span><span id="99fa" class="he hf dt ba ia b el iu iv iw ix iy ic r id" data-selectable-paragraph=""> 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();</span><span id="7848" class="he hf dt ba ia b el iu iv iw ix iy ic r id" data-selectable-paragraph=""> auth()->login($newUser, true); } return redirect()->to('/home'); }</span> |
خب تا اینجای کار شما همه کارو انجام دادین فقط بعد اینکه پکیجی رو نصب کردین حتما دامپ کنین:
1 2 3 |
php artisan clear-compiled composer dump-autoload php artisan optimize |
اگر خواستین از آدرس های مختلفی برای کالبک استفاده کنین دستور زیر کمکتون میکنه
1 2 3 |
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">socialLogin</span><span class="hljs-params">($loginFrom)</span></span>{ <span class="hljs-keyword">return</span> Socialite::driver(<span class="hljs-string">'google'</span>) >redirectUrl(<span class="hljs-string">'http://your-domain.com?data=123'</span>)->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