コンテンツにスキップ

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プロバイダを使用してユーザーを認証するには、2つのルートが必要です。1つはユーザーをOAuthプロバイダにリダイレクトするためのルート、もう1つは認証後にプロバイダからコールバックを受信するためのルートです。以下のルートの例は、両方のルートの実装を示しています

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');
});
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 providers...
$token = $user->token;
$refreshToken = $user->refreshToken;
$expiresIn = $user->expiresIn;
 
// OAuth 1.0 providers...
$token = $user->token;
$tokenSecret = $user->tokenSecret;
 
// All providers...
$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();