はじめに

典型的なフォームベースの認証に加えて、LaravelはLaravel Socialiteを使用してOAuthプロバイダーと簡単に認証する方法を提供します。Socialiteは現在、Facebook、X、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackを介した認証をサポートしています。

他のプラットフォーム用のアダプターは、コミュニティ主導のSocialite Providersウェブサイトを介して利用可能です。

インストール

Socialiteを始めるには、Composerパッケージマネージャーを使用して、パッケージをプロジェクトの依存関係に追加します:

  1. composer require laravel/socialite

Socialiteのアップグレード

Socialiteの新しいメジャーバージョンにアップグレードする際は、アップグレードガイドを注意深く確認することが重要です。

設定

Socialiteを使用する前に、アプリケーションが利用するOAuthプロバイダーの資格情報を追加する必要があります。通常、これらの資格情報は、認証を行うサービスのダッシュボード内で「開発者アプリケーション」を作成することで取得できます。

これらの資格情報は、アプリケーションのconfig/services.php設定ファイルに配置し、アプリケーションが必要とするプロバイダーに応じて、facebookxlinkedin-openidgooglegithubgitlabbitbucketslack、または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. ],
  1. <a name="authentication"></a>
  2. ## 認証
  3. <a name="routing"></a>
  4. ### ルーティング
  5. OAuthプロバイダーを使用してユーザーを認証するには、2つのルートが必要です: 1つはユーザーをOAuthプロバイダーにリダイレクトするため、もう1つは認証後にプロバイダーからのコールバックを受け取るためのものです。以下の例のルートは、両方のルートの実装を示しています:
  6. ``````php
  7. use Laravel\Socialite\Facades\Socialite;
  8. Route::get('/auth/redirect', function () {
  9. return Socialite::driver('github')->redirect();
  10. });
  11. Route::get('/auth/callback', function () {
  12. $user = Socialite::driver('github')->user();
  13. // $user->token
  14. });
  15. `
  1. <a name="authentication-and-storage"></a>
  2. ### 認証とストレージ
  3. ユーザーがOAuthプロバイダーから取得されたら、アプリケーションのデータベースにユーザーが存在するかどうかを確認し、[ユーザーを認証する](6a6e031a57c10fb9.md#authenticate-a-user-instance)ことができます。ユーザーがアプリケーションのデータベースに存在しない場合、通常はユーザーを表す新しいレコードをデータベースに作成します:
  4. ``````php
  5. use App\Models\User;
  6. use Illuminate\Support\Facades\Auth;
  7. use Laravel\Socialite\Facades\Socialite;
  8. Route::get('/auth/callback', function () {
  9. $githubUser = Socialite::driver('github')->user();
  10. $user = User::updateOrCreate([
  11. 'github_id' => $githubUser->id,
  12. ], [
  13. 'name' => $githubUser->name,
  14. 'email' => $githubUser->email,
  15. 'github_token' => $githubUser->token,
  16. 'github_refresh_token' => $githubUser->refreshToken,
  17. ]);
  18. Auth::login($user);
  19. return redirect('/dashboard');
  20. });
  21. `

特定のOAuthプロバイダーから利用可能なユーザー情報に関する詳細については、ユーザー詳細の取得に関するドキュメントを参照してください。

アクセススコープ

ユーザーをリダイレクトする前に、scopesメソッドを使用して、認証リクエストに含めるべき「スコープ」を指定できます。このメソッドは、以前に指定されたすべてのスコープを、指定したスコープとマージします:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('github')
  3. ->scopes(['read:user', 'public_repo'])
  4. ->redirect();
  1. ``````php
  2. return Socialite::driver('github')
  3. ->setScopes(['read:user', 'public_repo'])
  4. ->redirect();
  5. `

Slackボットスコープ

SlackのAPIは異なるタイプのアクセストークンを提供しており、それぞれに独自の権限スコープがあります。Socialiteは、以下の2種類のSlackアクセストークンタイプの両方に対応しています:

  • ボット(xoxb-でプレフィックス)
  • ユーザー(xoxp-でプレフィックス)

デフォルトでは、slackドライバーはuserトークンを生成し、ドライバーのuserメソッドを呼び出すとユーザーの詳細が返されます。

ボットトークンは、アプリケーションのユーザーが所有する外部Slackワークスペースに通知を送信する場合に主に便利です。ボットトークンを生成するには、ユーザーをSlackにリダイレクトする前にasBotUserメソッドを呼び出します:

  1. return 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メソッドを呼び出して連想配列を渡します:

  1. use Laravel\Socialite\Facades\Socialite;
  2. return Socialite::driver('google')
  3. ->with(['hd' => 'example.com'])
  4. ->redirect();
  1. <a name="retrieving-user-details"></a>
  2. ## ユーザー詳細の取得
  3. ユーザーがアプリケーションの認証コールバックルートにリダイレクトされた後、Socialiteの`````user`````メソッドを使用してユーザーの詳細を取得できます。`````user`````メソッドによって返されるユーザーオブジェクトは、ユーザーに関する情報を自分のデータベースに保存するために使用できるさまざまなプロパティとメソッドを提供します。
  4. OAuthプロバイダーがOAuth 1.0またはOAuth 2.0をサポートしているかどうかに応じて、このオブジェクトで利用可能なプロパティとメソッドは異なる場合があります:
  5. ``````php
  6. use Laravel\Socialite\Facades\Socialite;
  7. Route::get('/auth/callback', function () {
  8. $user = Socialite::driver('github')->user();
  9. // OAuth 2.0 providers...
  10. $token = $user->token;
  11. $refreshToken = $user->refreshToken;
  12. $expiresIn = $user->expiresIn;
  13. // OAuth 1.0 providers...
  14. $token = $user->token;
  15. $tokenSecret = $user->tokenSecret;
  16. // All providers...
  17. $user->getId();
  18. $user->getNickname();
  19. $user->getName();
  20. $user->getEmail();
  21. $user->getAvatar();
  22. });
  23. `

トークンからのユーザー詳細の取得

すでにユーザーの有効なアクセストークンを持っている場合、SocialiteのuserFromTokenメソッドを使用してユーザーの詳細を取得できます:

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

iOSアプリケーションを介してFacebookの制限付きログインを使用している場合、Facebookはアクセストークンの代わりにOIDCトークンを返します。アクセストークンと同様に、OIDCトークンはuserFromTokenメソッドに提供してユーザーの詳細を取得できます。

ステートレス認証

  1. ``````php
  2. use Laravel\Socialite\Facades\Socialite;
  3. return Socialite::driver('google')->stateless()->user();
  4. `