はじめに
典型的なフォームベースの認証に加えて、LaravelはLaravel Socialiteを使用してOAuthプロバイダーと簡単に認証する方法を提供します。Socialiteは現在、Facebook、X、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackを介した認証をサポートしています。
他のプラットフォーム用のアダプターは、コミュニティ主導の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',
],
<a name="authentication"></a>
## 認証
<a name="routing"></a>
### ルーティング
OAuthプロバイダーを使用してユーザーを認証するには、2つのルートが必要です: 1つはユーザーをOAuthプロバイダーにリダイレクトするため、もう1つは認証後にプロバイダーからのコールバックを受け取るためのものです。以下の例のルートは、両方のルートの実装を示しています:
``````php
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
});
`
<a name="authentication-and-storage"></a>
### 認証とストレージ
ユーザーがOAuthプロバイダーから取得されたら、アプリケーションのデータベースにユーザーが存在するかどうかを確認し、[ユーザーを認証する](6a6e031a57c10fb9.md#authenticate-a-user-instance)ことができます。ユーザーがアプリケーションのデータベースに存在しない場合、通常はユーザーを表す新しいレコードをデータベースに作成します:
``````php
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');
});
`
特定のOAuthプロバイダーから利用可能なユーザー情報に関する詳細については、ユーザー詳細の取得に関するドキュメントを参照してください。
アクセススコープ
ユーザーをリダイレクトする前に、scopes
メソッドを使用して、認証リクエストに含めるべき「スコープ」を指定できます。このメソッドは、以前に指定されたすべてのスコープを、指定したスコープとマージします:
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('github')
->scopes(['read:user', 'public_repo'])
->redirect();
``````php
return Socialite::driver('github')
->setScopes(['read:user', 'public_repo'])
->redirect();
`
Slackボットスコープ
SlackのAPIは異なるタイプのアクセストークンを提供しており、それぞれに独自の権限スコープがあります。Socialiteは、以下の2種類の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();
<a name="retrieving-user-details"></a>
## ユーザー詳細の取得
ユーザーがアプリケーションの認証コールバックルートにリダイレクトされた後、Socialiteの`````user`````メソッドを使用してユーザーの詳細を取得できます。`````user`````メソッドによって返されるユーザーオブジェクトは、ユーザーに関する情報を自分のデータベースに保存するために使用できるさまざまなプロパティとメソッドを提供します。
OAuthプロバイダーがOAuth 1.0またはOAuth 2.0をサポートしているかどうかに応じて、このオブジェクトで利用可能なプロパティとメソッドは異なる場合があります:
``````php
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の制限付きログインを使用している場合、Facebookはアクセストークンの代わりにOIDCトークンを返します。アクセストークンと同様に、OIDCトークンはuserFromToken
メソッドに提供してユーザーの詳細を取得できます。
ステートレス認証
``````php
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')->stateless()->user();
`