Laravel을 사용한 소셜 인증



양식을 채우고 이메일을 확인하는 엄격한 프로세스 없이 인증 프로세스를 매우 쉽게 수행할 수 있으므로 가입 및 서명에 소셜 계정을 사용하는 것이 점차 새로운 표준이 되고 있습니다.

이 자습서에서는 인증을 위해 Laravel Socialite을 사용하는 방법을 안내합니다.

이 튜토리얼에서는 소셜 로그인을 통합할 것입니다. 이것은 초보자용 가이드가 아니므로 Laravel 앱 설정이 있다고 가정합니다. Laravel Doc이 이에 대한 좋은 가이드입니다.

시작하자.

전제 조건


API IDSECRET를 얻으려면 소셜용 새 앱을 만들어야 합니다.

Facebook , , GithubGoogle용 소셜 앱 만들기 가이드를 사용하세요.

설치



Laravel 앱에서 터미널에서 다음 명령을 실행합니다.

composer require laravel/socialite


그런 다음 config/services.php로 이동하여 변수를 업데이트합니다.

// Facebook Config
'facebook' => [
    'client_id' => env('FACEBOOK_CLIENT_ID'),  // Your Facebook App ID
    'client_secret' => env('FACEBOOK_CLIENT_SECRET'), // Your Facebook App Secret
    'redirect' => env('FACEBOOK_CALLBACK_URL')
],

// Twitter Config
'twitter' => [
    'client_id' => env('TWITTER_CLIENT_ID'),  // Your Twitter Client ID
    'client_secret' => env('TWITTER_CLIENT_SECRET'), // Your Twitter Client Secret
    'redirect' => env('TWITTER_CALLBACK_URL'),
],

// Github Config
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'), // Your GitHub Client ID
    'client_secret' => env('GITHUB_CLIENT_SECRET'), // Your GitHub Client Secret
    'redirect' => env('GITHUB_CALLBACK_URL'),
],

// Google Config
'google' => [
    'client_id' => env('GOOGLE_CLIENT_ID'), // Your Google Client ID
    'client_secret' => env('GOOGLE_CLIENT_SECRET'), // Your Google Client Secret
    'redirect' => env('GOOGLE_CALLBACK_URL'),
],

.env를 다음과 같이 업데이트하십시오.

FACEBOOK_CLIENT_ID=********
FACEBOOK_CLIENT_SECRET=********
FACEBOOK_CALLBACK_URL=https://app-url/login/facebook/callback

TWITTER_CLIENT_ID=********
TWITTER_CLIENT_SECRET=********
TWITTER_CALLBACK_URL=https://app-url/login/twitter/callback

GITHUB_CLIENT_ID=********
GITHUB_CLIENT_SECRET=********
GITHUB_CALLBACK_URL=https://app-url/login/github/callback

GOOGLE_CLIENT_ID=********
GOOGLE_CLIENT_SECRET=********
GOOGLE_CALLBACK_URL=https://app-url/login/google/callback


데이터베이스/마이그레이션



사용자 테이블을 수정하고 emailpassword 열을 null로 만들 수 있습니다.

$table->string('email')->unique()->nullable();
$table->string('password')->nullable();


소셜 계정에 대해 다음 열을 추가하십시오.

$table->string('provider', 20)->nullable();
$table->string('provider_id')->nullable();
$table->string('access_token')->nullable();


명령줄에서 마이그레이션을 실행할 수 없습니다.

php artisan migrate


라우팅



이를 위해서는 두 개의 경로가 필요합니다. 하나는 공급자로 리디렉션하기 위한 것이고 다른 하나는 인증 후 공급자로부터 콜백을 받기 위한 것입니다.
routes/web.php에 다음 경로를 추가합니다.

Route::get('login/{provider}', 'AuthLoginController@redirectToProvider')->name('login.social');

Route::get('login/{provider}/callback','AuthLoginController@handleProviderCallback');


다음으로 LoginController 를 업데이트해야 합니다.SocialiteSocialite Facade을 사용하여 액세스됩니다.

<?php

namespace App\Http\Controllers\Auth;

use Auth;
use Socialite;
use Carbon\Carbon;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /**
     * Redirect the user to the social authentication page.
     * this includes GitHub, Twitter, Facebook, and Google
     *
     * @return Response
    */
    public function redirectToProvider($provider)
    {
         return Socialite::driver($provider)->redirect();
    }

    /**
     * Obtain the user information from Social Account.
     *
     * @return Response
    */
    public function handleProviderCallback($provider)
    {
        try {
            $providerUser= Socialite::driver($provider)->user();
        } catch (Exception $e) {
            return $this->sendFailedResponse($e->getMessage());
        }

        if ($user->email != null) {
            $authUser = $this->findOrCreateUser($providerUser, $provider);
            Auth::login($authUser, true);
            return redirect()->intended('/');
        }
        return $this->sendFailedResponse();
    }


   /**
     * If a user has registered before using social auth, return the user
     * else, create a new user object.
     * @param  $providerUser Socialite user object
     * @param $provider Social auth provider
     * @return  User
     */
   public function findOrCreateUser($providerUser, $provider)
   {
        $authUser = User::where('email', $providerUser->email)->first();
        if ($authUser) {
            return $authUser;
        } else {
            $user = User::create([
               'name'              => $providerUser->name,
               'email'             => $providerUser->email,
               'provider_id'       => $providerUser->id,
               'access_token'      => $providerUser->token,
               'provider_name'     => $provider,
               'email_verified_at' => Carbon::now()->format('Y-m-d H:i:s');
               ]);
           }
           return $user;
       }
   }

    /**
      * Send a failed response with a msg
      *
      * @param null $msg
      * @return \Illuminate\Http\RedirectResponse
    */
    protected function sendFailedResponse($message = null)
    {
         return redirect()->route('login')
             ->withError(['message' => $message ?: 'Unable to login, try with another provider to login.']);
    }


마지막으로 blade 파일에서 등록 및 로그인 양식에 다양한 링크를 추가할 수 있습니다.

...
  href="{{ route('login.social', 'facebook') }}" 

  href="{{ route('login.social', 'twitter') }}" 

  href="{{ route('login.social', 'github') }}" 

  href="{{ route('login.social', 'google') }}"
...


결론적으로



Laravel 앱에 소셜 로그인을 성공적으로 추가했습니다.

좋은 웹페이지 즐겨찾기