Skip to content

Laravel Socialite

はじめに

Laravelは、従来のフォームベースの認証に加えて、Laravel Socialiteを使用してOAuthプロバイダーで認証するためのシンプルで便利な方法も提供しています。Socialiteは現在、Facebook、X、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackを介した認証をサポートしています。

Note

他のプラットフォーム用のアダプターは、コミュニティ主導のSocialite Providersウェブサイトから入手できます。

インストール

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

composer require laravel/socialite

Socialiteのアップグレード

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

設定

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

これらの認証情報は、アプリケーションのconfig/services.php設定ファイルに配置し、キーfacebookxlinkedin-openidgooglegithubgitlabbitbucketslack、または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メソッドを使用する場合、stateresponse_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();

ユーザーノート