Skip to content

Laravel Socialite

소개

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

lightbulb

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

설치

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

composer require laravel/socialite

Socialite 업그레이드

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

구성

Socialite를 사용하기 전에 애플리케이션이 사용하는 OAuth 제공업체에 대한 자격 증명을 추가해야 합니다. 일반적으로 이러한 자격 증명은 인증할 서비스의 대시보드 내에서 "개발자 애플리케이션"을 만들어 검색할 수 있습니다.

이러한 자격 증명은 애플리케이션의 config/services.php 구성 파일에 배치해야 하며, 애플리케이션에 필요한 제공업체에 따라 facebook, x, linkedin-openid, google, github, gitlab, bitbucket, slack 또는 slack-openid 키를 사용해야 합니다.

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

redirect 옵션에 상대 경로가 포함된 경우, 완전한 URL로 자동 변환됩니다.

인증

라우팅

OAuth 제공업체를 사용하여 사용자를 인증하려면 두 개의 경로가 필요합니다. 하나는 사용자를 OAuth 제공업체로 리디렉션하는 경로이고, 다른 하나는 인증 후 제공업체에서 콜백을 받는 경로입니다. 아래 예시 경로는 두 경로의 구현을 보여줍니다.

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 facade에서 제공하는 redirect 메서드는 사용자를 OAuth 제공업체로 리디렉션하는 역할을 하며, user 메서드는 들어오는 요청을 검사하고 인증 요청을 승인한 후 제공업체에서 사용자의 정보를 검색합니다.

인증 및 저장

OAuth 제공업체에서 사용자를 검색한 후, 사용자가 애플리케이션의 데이터베이스에 존재하는지 확인하고 사용자를 인증할 수 있습니다. 사용자가 애플리케이션의 데이터베이스에 존재하지 않으면 일반적으로 데이터베이스에 사용자를 나타내는 새 레코드를 생성합니다.

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');
});
lightbulb

특정 OAuth 제공업체에서 사용할 수 있는 사용자 정보에 대한 자세한 내용은 사용자 세부 정보 검색에 대한 설명서를 참조하십시오.

액세스 범위

사용자를 리디렉션하기 전에 scopes 메서드를 사용하여 인증 요청에 포함되어야 하는 "범위"를 지정할 수 있습니다. 이 메서드는 이전에 지정된 모든 범위와 지정하는 범위를 병합합니다.

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

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

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

Slack 봇 범위

Slack API는 다양한 유형의 액세스 토큰을 제공하며, 각 토큰에는 고유한 권한 범위 집합이 있습니다. Socialite는 다음 Slack 액세스 토큰 유형과 모두 호환됩니다.

  • 봇 (접두사 xoxb-)
  • 사용자 (접두사 xoxp-)

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

봇 토큰은 주로 애플리케이션 사용자가 소유한 외부 Slack 작업 공간으로 알림을 보내는 경우에 유용합니다. 봇 토큰을 생성하려면 인증을 위해 사용자를 Slack으로 리디렉션하기 전에 asBotUser 메서드를 호출하십시오.

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

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

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

봇 토큰을 생성할 때 user 메서드는 여전히 Laravel\Socialite\Two\User 인스턴스를 반환하지만, token 속성만 채워집니다. 이 토큰은 인증된 사용자의 Slack 작업 공간으로 알림을 보내기 위해 저장할 수 있습니다.

선택적 매개변수

다수의 OAuth 제공업체는 리디렉션 요청에 대한 기타 선택적 매개변수를 지원합니다. 요청에 선택적 매개변수를 포함하려면 연관 배열과 함께 with 메서드를 호출하십시오.

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

with 메서드를 사용할 때는 state 또는 response_type와 같은 예약된 키워드를 전달하지 않도록 주의하십시오.

사용자 세부 정보 검색

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

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

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 메서드를 사용하여 사용자 세부 정보를 검색할 수 있습니다.

use Laravel\Socialite\Facades\Socialite;
 
$user = Socialite::driver('github')->userFromToken($token);

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

상태 비저장 인증

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

use Laravel\Socialite\Facades\Socialite;
 
return Socialite::driver('google')->stateless()->user();