Skip to content

Laravel Socialite

소개

일반적인 폼 기반 인증 외에도, Laravel은 Laravel Socialite를 사용하여 OAuth 제공자와 간편하게 인증할 수 있는 방법을 제공합니다. Socialite는 현재 Facebook, X, LinkedIn, Google, GitHub, GitLab, Bitbucket, Slack을 통한 인증을 지원합니다.

NOTE

다른 플랫폼용 어댑터는 커뮤니티가 주도하는 Socialite Providers 웹사이트에서 제공됩니다.

설치

Socialite를 시작하려면 Composer 패키지 관리자를 사용하여 프로젝트의 의존성에 패키지를 추가하세요:

shell
composer require laravel/socialite

Socialite 업그레이드

Socialite의 새로운 주요 버전으로 업그레이드할 때는 업그레이드 가이드를 꼼꼼히 검토하는 것이 중요합니다.

설정

Socialite를 사용하기 전에, 애플리케이션에서 사용할 OAuth 제공자에 대한 자격 증명을 추가해야 합니다. 일반적으로 이러한 자격 증명은 인증할 서비스의 대시보드에서 "개발자 애플리케이션"을 생성하여 얻을 수 있습니다.

이 자격 증명은 애플리케이션의 config/services.php 설정 파일에 추가해야 하며, 애플리케이션에서 필요한 제공자에 따라 facebook, x, linkedin-openid, google, github, gitlab, bitbucket, slack, 또는 slack-openid 키를 사용해야 합니다:

php
'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => 'http://example.com/callback-url',
],

NOTE

redirect 옵션에 상대 경로가 포함되어 있으면, 자동으로 완전한 URL로 변환됩니다.

인증

라우팅

OAuth 제공자를 사용하여 사용자를 인증하려면, 사용자를 OAuth 제공자로 리디렉션하는 라우트와 인증 후 제공자로부터 콜백을 받는 라우트, 두 개의 라우트가 필요합니다. 아래 예시 라우트는 두 라우트의 구현 방법을 보여줍니다:

php
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/redirect', function () {
    return Socialite::driver('github')->redirect();
});

Route::get('/auth/callback', function () {
    $user = Socialite::driver('github')->user();

    // $user->token
});

Socialite 파사드에서 제공하는 redirect 메서드는 사용자를 OAuth 제공자로 리디렉션하는 역할을 하며, user 메서드는 인증 요청이 승인된 후 들어오는 요청을 검사하고 제공자로부터 사용자 정보를 가져옵니다.

인증 및 저장

OAuth 제공자로부터 사용자를 가져온 후, 해당 사용자가 애플리케이션 데이터베이스에 존재하는지 확인하고 사용자를 인증할 수 있습니다. 사용자가 데이터베이스에 없다면, 일반적으로 사용자를 나타내는 새 레코드를 생성합니다:

php
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/callback', function () {
    $githubUser = Socialite::driver('github')->user();

    $user = User::updateOrCreate([
        'github_id' => $githubUser->id,
    ], [
        'name' => $githubUser->name,
        'email' => $githubUser->email,
        'github_token' => $githubUser->token,
        'github_refresh_token' => $githubUser->refreshToken,
    ]);

    Auth::login($user);

    return redirect('/dashboard');
});

NOTE

특정 OAuth 제공자로부터 어떤 사용자 정보를 얻을 수 있는지에 대한 자세한 내용은 사용자 정보 가져오기 문서를 참고하세요.

액세스 범위(Scopes)

사용자를 리디렉션하기 전에, scopes 메서드를 사용하여 인증 요청에 포함할 "범위(scope)"를 지정할 수 있습니다. 이 메서드는 이전에 지정된 모든 범위와 새로 지정한 범위를 병합합니다:

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('github')
    ->scopes(['read:user', 'public_repo'])
    ->redirect();

setScopes 메서드를 사용하면 인증 요청의 기존 모든 범위를 덮어쓸 수 있습니다:

php
return Socialite::driver('github')
    ->setScopes(['read:user', 'public_repo'])
    ->redirect();

Slack 봇 범위

Slack의 API는 여러 종류의 액세스 토큰을 제공하며, 각각 고유한 권한 범위를 가집니다. Socialite는 다음 두 가지 Slack 액세스 토큰 유형 모두와 호환됩니다:

  • 봇(Bot, xoxb-로 시작)
  • 사용자(User, xoxp-로 시작)

기본적으로, slack 드라이버는 user 토큰을 생성하며, 드라이버의 user 메서드를 호출하면 사용자 정보를 반환합니다.

봇 토큰은 애플리케이션이 사용자의 Slack 워크스페이스에 알림을 전송해야 할 때 주로 유용합니다. 봇 토큰을 생성하려면, 사용자를 Slack으로 인증하러 리디렉션하기 전에 asBotUser 메서드를 호출하세요:

php
return Socialite::driver('slack')
    ->asBotUser()
    ->setScopes(['chat:write', 'chat:write.public', 'chat:write.customize'])
    ->redirect();

또한, Slack이 인증 후 사용자를 애플리케이션으로 리디렉션한 뒤에도 user 메서드를 호출하기 전에 반드시 asBotUser 메서드를 호출해야 합니다:

php
$user = Socialite::driver('slack')->asBotUser()->user();

봇 토큰을 생성할 때, user 메서드는 여전히 Laravel\Socialite\Two\User 인스턴스를 반환하지만, token 속성만 채워집니다. 이 토큰은 인증된 사용자의 Slack 워크스페이스에 알림을 전송하는 데 저장할 수 있습니다.

옵션 파라미터

일부 OAuth 제공자는 리디렉션 요청에 추가적인 옵션 파라미터를 지원합니다. 요청에 옵션 파라미터를 포함하려면, 연관 배열을 with 메서드에 전달하세요:

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('google')
    ->with(['hd' => 'example.com'])
    ->redirect();

WARNING

with 메서드를 사용할 때는 stateresponse_type과 같은 예약어를 전달하지 않도록 주의하세요.

사용자 정보 가져오기

사용자가 애플리케이션의 인증 콜백 라우트로 리디렉션된 후, Socialite의 user 메서드를 사용하여 사용자 정보를 가져올 수 있습니다. user 메서드가 반환하는 사용자 객체는 데이터베이스에 사용자 정보를 저장할 때 사용할 수 있는 다양한 속성과 메서드를 제공합니다.

인증하는 OAuth 제공자가 OAuth 1.0 또는 OAuth 2.0을 지원하는지에 따라 이 객체에서 사용할 수 있는 속성과 메서드가 다를 수 있습니다:

php
use Laravel\Socialite\Facades\Socialite;

Route::get('/auth/callback', function () {
    $user = Socialite::driver('github')->user();

    // OAuth 2.0 제공자...
    $token = $user->token;
    $refreshToken = $user->refreshToken;
    $expiresIn = $user->expiresIn;

    // OAuth 1.0 제공자...
    $token = $user->token;
    $tokenSecret = $user->tokenSecret;

    // 모든 제공자...
    $user->getId();
    $user->getNickname();
    $user->getName();
    $user->getEmail();
    $user->getAvatar();
});

토큰으로 사용자 정보 가져오기

이미 사용자의 유효한 액세스 토큰이 있다면, Socialite의 userFromToken 메서드를 사용하여 사용자 정보를 가져올 수 있습니다:

php
use Laravel\Socialite\Facades\Socialite;

$user = Socialite::driver('github')->userFromToken($token);

iOS 애플리케이션을 통해 Facebook Limited Login을 사용하는 경우, Facebook은 액세스 토큰 대신 OIDC 토큰을 반환합니다. 액세스 토큰과 마찬가지로, OIDC 토큰도 userFromToken 메서드에 전달하여 사용자 정보를 가져올 수 있습니다.

무상태 인증

stateless 메서드는 세션 상태 검증을 비활성화하는 데 사용할 수 있습니다. 이 방법은 쿠키 기반 세션을 사용하지 않는 무상태 API에 소셜 인증을 추가할 때 유용합니다:

php
use Laravel\Socialite\Facades\Socialite;

return Socialite::driver('google')->stateless()->user();

나를 위한 문서 한글화