イントロダクション
Laravelは、一般的なフォームベースの認証に加えて、Laravel Socialite(ソーシャライト:名士)を使用したOAuthプロバイダで認証するためのシンプルで便利な方法も提供します。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucketでの認証をサポートしています。
Note: 他のプラットフォームのアダプタは、コミュニティにより管理されているSocialiteプロバイダWebサイトから利用できます。
インストール
Socialiteを使い始めるには、Composerパッケージマネージャを使用して、プロジェクトの依存関係へパッケージを追加します。
composer require laravel/socialite
Socialiteのアップグレード
Socialiteの新しいメジャーバージョンにアップグレードするときは、アップグレードガイドを注意深く確認することが重要です。
設定
Socialiteを使用する前に、アプリケーションが利用するOAuthプロバイダの認証情報を追加する必要があります。通常、これらの認証情報は、認証するサービスのダッシュボード内で「開発者用アプリケーション」を作成することで取得できます。
こうした認証情報は、アプリケーションのconfig/services.php
設定ファイルへ記述します。キーはfacebook
,
twitter
(OAuth1.0)、twitter-oauth-2
(OAuth
2.0)、linkedin
、google
、github
、gitlab
、bitbucket
で、アプリケーションで必要なプロバイダによります。
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'http://example.com/callback-url',
],
Note:
redirect
オプションが相対パスである場合、自動的に完全なURLへ解決されます。
認証
ルート
OAuthプロバイダを使ってユーザーを認証するには、OAuthプロバイダへユーザーをリダイレクトするルートと、認証後にプロバイダからのコールバックを受け取るルートの2つが必要になります。以下のルート例では、両方のルートを実装しています。
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();
オプションのパラメータ
多くのOAuthプロバイダがリダイレクトリクエスト中で、その他にもオプションパラメータをサポートしています。リクエストにオプションパラメータを含めるには、with
メソッドを呼び出し、連想配列を渡します。
use Laravel\Socialite\Facades\Socialite;
return Socialite::driver('google')
->with(['hd' => 'example.com'])
->redirect();
Warning!!
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();
Warning!! Twitter OAuth.0ドライバでは、ステートレス認証は利用できません。