Laravel Socialite
イントロダクション
一般的なフォームベースの認証に加えて、LaravelはLaravel Socialiteを使用してOAuthプロバイダで認証する、シンプルで便利な方法も提供しています。Socialiteは現在、Facebook、X、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackによる認証をサポートしています。
他のプラットフォーム用のアダプタは、コミュニティが運営するSocialite ProvidersのWebサイトで入手できます。
インストール
Socialiteを使い始めるには、Composerパッケージマネージャを使用して、プロジェクトの依存関係にパッケージを追加します。
1composer require laravel/socialite
Socialiteのアップグレード
Socialiteの新しいメジャーバージョンにアップグレードする場合は、アップグレードガイドを注意深く確認することが重要です。
設定
Socialiteを使用する前に、アプリケーションが利用するOAuthプロバイダの認証情報を追加する必要があります。通常、これらの認証情報は、認証するサービスのダッシュボード内で「開発者アプリケーション」を作成することで取得できます。
これらの認証情報は、アプリケーションのconfig/services.php設定ファイルに配置し、アプリケーションが必要とするプロバイダに応じて、facebook、x、linkedin-openid、google、github、gitlab、bitbucket、slack、またはslack-openidのキーを使用する必要があります。
1'github' => [2 'client_id' => env('GITHUB_CLIENT_ID'),3 'client_secret' => env('GITHUB_CLIENT_SECRET'),4 'redirect' => 'http://example.com/callback-url',5],
redirectオプションに相対パスが含まれている場合は、自動的に完全修飾URLに解決されます。
認証
ルーティング
OAuthプロバイダを使用してユーザーを認証するには、2つのルートが必要です。1つはユーザーをOAuthプロバイダにリダイレクトするため、もう1つは認証後にプロバイダからのコールバックを受信するためのものです。以下のルート例は、両方のルートの実装を示しています。
1use Laravel\Socialite\Facades\Socialite; 2 3Route::get('/auth/redirect', function () { 4 return Socialite::driver('github')->redirect(); 5}); 6 7Route::get('/auth/callback', function () { 8 $user = Socialite::driver('github')->user(); 9 10 // $user->token11});
Socialiteファサードが提供するredirectメソッドは、ユーザーをOAuthプロバイダにリダイレクトする処理を行い、一方userメソッドは、ユーザーが認証リクエストを承認した後に、受信リクエストを調べてプロバイダからユーザーの情報を取得します。
認証とストレージ
OAuthプロバイダからユーザーを取得したら、ユーザーがアプリケーションのデータベースに存在するかどうかを判断し、ユーザーを認証できます。ユーザーがアプリケーションのデータベースに存在しない場合は、通常、データベースに新しいレコードを作成してユーザーを表します。
1use App\Models\User; 2use Illuminate\Support\Facades\Auth; 3use Laravel\Socialite\Facades\Socialite; 4 5Route::get('/auth/callback', function () { 6 $githubUser = Socialite::driver('github')->user(); 7 8 $user = User::updateOrCreate([ 9 'github_id' => $githubUser->id,10 ], [11 'name' => $githubUser->name,12 'email' => $githubUser->email,13 'github_token' => $githubUser->token,14 'github_refresh_token' => $githubUser->refreshToken,15 ]);16 17 Auth::login($user);18 19 return redirect('/dashboard');20});
特定のOAuthプロバイダからどのようなユーザー情報が利用できるかについての詳細は、ユーザー詳細の取得に関するドキュメントを参照してください。
アクセススコープ
ユーザーをリダイレクトする前に、scopesメソッドを使用して、認証リクエストに含めるべき「スコープ」を指定できます。このメソッドは、以前に指定したすべてのスコープと、指定したスコープをマージします。
1use Laravel\Socialite\Facades\Socialite;2 3return Socialite::driver('github')4 ->scopes(['read:user', 'public_repo'])5 ->redirect();
setScopesメソッドを使用して、認証リクエストの既存のスコープをすべて上書きできます。
1return Socialite::driver('github')2 ->setScopes(['read:user', 'public_repo'])3 ->redirect();
Slackボットスコープ
SlackのAPIは、さまざまな種類のアクセストークンを提供しており、それぞれに独自のパーミッションスコープのセットがあります。Socialiteは、以下の両方のSlackアクセストークンタイプと互換性があります。
- ボット(
xoxb-で始まる) - ユーザー(
xoxp-で始まる)
デフォルトでは、slackドライバはuserトークンを生成し、ドライバのuserメソッドを呼び出すと、ユーザーの詳細が返されます。
ボットトークンは、主にアプリケーションが、そのアプリケーションのユーザーが所有する外部のSlackワークスペースに通知を送信する場合に役立ちます。ボットトークンを生成するには、ユーザーを認証のためにSlackにリダイレクトする前にasBotUserメソッドを呼び出します。
1return Socialite::driver('slack')2 ->asBotUser()3 ->setScopes(['chat:write', 'chat:write.public', 'chat:write.customize'])4 ->redirect();
さらに、認証後にSlackがユーザーをアプリケーションにリダイレクトしてきた後、userメソッドを呼び出す前に、asBotUserメソッドを呼び出す必要があります。
1$user = Socialite::driver('slack')->asBotUser()->user();
ボットトークンを生成する場合でも、userメソッドはLaravel\Socialite\Two\Userインスタンスを返しますが、tokenプロパティのみが設定されます。このトークンは、認証済みユーザーのSlackワークスペースに通知を送信するために保存できます。
オプションパラメータ
多くのOAuthプロバイダは、リダイレクト要求で他のオプションパラメータをサポートしています。リクエストにオプションのパラメータを含めるには、連想配列を指定しwithメソッドを呼び出します。
1use Laravel\Socialite\Facades\Socialite;2 3return Socialite::driver('google')4 ->with(['hd' => 'example.com'])5 ->redirect();
withメソッドを使用する場合は、stateやresponse_typeなどの予約済みキーワードを渡さないように注意してください。
ユーザー詳細の取得
ユーザーがアプリケーションの認証コールバックルートにリダイレクトされた後、Socialiteのuserメソッドを使用してユーザーの詳細を取得できます。userメソッドによって返されるユーザーオブジェクトは、ユーザーに関する情報を独自のデータベースに保存するために使用できる、さまざまなプロパティとメソッドを提供します。
認証しているOAuthプロバイダがOAuth 1.0とOAuth 2.0のどちらをサポートしているかに応じて、このオブジェクトで利用できるプロパティとメソッドは異なる場合があります。
1use Laravel\Socialite\Facades\Socialite; 2 3Route::get('/auth/callback', function () { 4 $user = Socialite::driver('github')->user(); 5 6 // OAuth 2.0 providers... 7 $token = $user->token; 8 $refreshToken = $user->refreshToken; 9 $expiresIn = $user->expiresIn;10 11 // OAuth 1.0 providers...12 $token = $user->token;13 $tokenSecret = $user->tokenSecret;14 15 // All providers...16 $user->getId();17 $user->getNickname();18 $user->getName();19 $user->getEmail();20 $user->getAvatar();21});
トークンからのユーザー詳細の取得
ユーザーの有効なアクセストークンをすでに持っている場合は、SocialiteのuserFromTokenメソッドを使用してユーザーの詳細を取得できます。
1use Laravel\Socialite\Facades\Socialite;2 3$user = Socialite::driver('github')->userFromToken($token);
iOSアプリケーションを介してFacebookの限定ログインを使用している場合、Facebookはアクセストークンの代わりにOIDCトークンを返します。アクセストークンと同様に、OIDCトークンをuserFromTokenメソッドに渡してユーザーの詳細を取得できます。
ステートレス認証
statelessメソッドは、セッション状態の検証を無効にするために使用できます。これは、Cookieベースのセッションを利用しないステートレスAPIにソーシャル認証を追加する場合に便利です。
1use Laravel\Socialite\Facades\Socialite;2 3return Socialite::driver('google')->stateless()->user();