イントロダクション
Laravelは、一般的なフォームベースの認証に加えて、Laravel Socialite(ソーシャライト:名士)を使用したOAuthプロバイダで認証するためのシンプルで便利な方法も提供します。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucketでの認証をサポートしています。
Tip!! 他のプラットフォームのアダプタは、コミュニティにより管理されているSocialiteプロバイダWebサイトで一覧できます。
インストール
Socialiteを使い始めるには、Composerパッケージマネージャーを使用して、プロジェクトの依存関係へパッケージを追加します。
composer require laravel/socialite
Socialiteのアップグレード
Socialiteの新しいメジャーバージョンにアップグレードするときは、アップグレードガイドを注意深く確認することが重要です。
設定
Socialiteを使用する前に、アプリケーションが使用するOAuthプロバイダの資格情報を追加する必要があります。これらの認証情報は、アプリケーションのconfig/services.php
設定ファイルへ配置しておく必要があり、アプリケーションに必要なプロバイダに応じキーとしてfacebook
、twitter
、linkedin
、google
、github
、gitlab
、bitbucket
を使用する必要があります。
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'http://example.com/callback-url',
],
Tip!!
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::where('github_id', $githubUser->id)->first();
if ($user) {
$user->update([
'github_token' => $githubUser->token,
'github_refresh_token' => $githubUser->refreshToken,
]);
} else {
$user = User::create([
'name' => $githubUser->name,
'email' => $githubUser->email,
'github_id' => $githubUser->id,
'github_token' => $githubUser->token,
'github_refresh_token' => $githubUser->refreshToken,
]);
}
Auth::login($user);
return redirect('/dashboard');
});
Tip!! 特定の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();
オプションのパラメータ
多くのOAuthプロバイダがリダイレクトリクエスト中のオプションパラメータをサポートしています。リクエストにオプションパラメータを含めるには、with
メソッドを呼び出し、連想配列を渡します。
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')
->with(['hd' => 'example.com'])
->redirect();
Note:
with
メソッド使用時は、state
やresponse_type
などの予約キーワードを渡さないように注意してください。
ユーザー詳細情報の取得
ユーザーを認証コールバックルートへリダイレクトした後、Socialiteのuser
メソッドを使用してユーザーの詳細を取得できます。user
メソッドが返すユーザーオブジェクトは、ユーザーに関する情報を独自のデータベースに保存するために使用できるさまざまなプロパティとメソッドを提供します。認証するOAuthプロバイダがOAuth1.0またはOAuth2.0のどちらをサポートしているかに応じて、さまざまなプロパティとメソッドが使用できます。
use Laravel\Socialite\Facades\Socialite;
Route::get('/auth/callback', function () {
$user = Socialite::driver('github')->user();
// OAuth2.0プロバイダ
$token = $user->token;
$refreshToken = $user->refreshToken;
$expiresIn = $user->expiresIn;
// OAuth1.0プロバイダ
$token = $user->token;
$tokenSecret = $user->tokenSecret;
// 両プロバイダ
$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
});
トークンからのユーザー詳細情報の取得(OAuth2)
ユーザーの有効なアクセストークンを既に持っている場合は、SocialiteのuserFromToken
メソッドを使用してユーザーの詳細を取得できます。
use Laravel\Socialite\Facades\Socialite;
$user = Socialite::driver('github')->userFromToken($token);
トークンとSecretからのユーザー詳細情報の取得(OAuth1)
ユーザーの有効なトークンとシークレットが既にある場合は、SocialiteのuserFromTokenAndSecret
メソッドを使用してユーザーの詳細を取得できます。
use Laravel\Socialite\Facades\Socialite;
$user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret);
ステートレス認証
stateless
メソッドを使用して、セッション状態の検証を無効にすることができます。これは、APIにソーシャル認証を追加するときに役立ちます。
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')->stateless()->user();
Note: ステートレス認証は、認証にOAuth1.0を使用するTwitterドライバでは使用できません。