Laravel Socialite¶
はじめに¶
Laravelは、従来のフォームベースの認証に加えて、Laravel Socialiteを使用してOAuthプロバイダーで認証するためのシンプルで便利な方法も提供しています。Socialiteは現在、Facebook、X、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackを介した認証をサポートしています。
Note
他のプラットフォーム用のアダプターは、コミュニティ主導のSocialite Providersウェブサイトから入手できます。
インストール¶
Socialiteを使い始めるには、Composerパッケージマネージャーを使用して、プロジェクトの依存関係にパッケージを追加します。
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',
],
Note
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
ファサードが提供する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');
});
Note
特定の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 Botスコープ¶
SlackのAPIは、それぞれ独自の権限スコープを持つ異なるタイプのアクセストークンを提供します。Socialiteは、以下の両方のSlackアクセストークンタイプと互換性があります。
- Bot(
xoxb-
で始まる) - User(
xoxp-
で始まる)
デフォルトでは、slack
ドライバーはuser
トークンを生成し、ドライバーのuser
メソッドを呼び出すとユーザーの詳細が返されます。
Botトークンは、主にアプリケーションがアプリケーションのユーザーが所有する外部のSlackワークスペースに通知を送信する場合に便利です。Botトークンを生成するには、ユーザーを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();
Botトークンを生成する場合、user
メソッドは依然としてLaravel\Socialite\Two\User
インスタンスを返します。ただし、token
プロパティのみがハイドレートされます。このトークンは、認証されたユーザーのSlackワークスペースに通知を送信するために保存できます。
オプションパラメータ¶
多くのOAuthプロバイダーは、リダイレクトリクエストで他のオプションパラメーターをサポートしています。リクエストにオプションパラメーターを含めるには、連想配列を指定してwith
メソッドを呼び出します。
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')
->with(['hd' => 'example.com'])
->redirect();
Warning
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
メソッドを使用してセッション状態の検証を無効にすることができます。これは、Cookieベースのセッションを使用しないステートレスAPIにソーシャル認証を追加する場合に便利です。
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')->stateless()->user();