#はじめに
通常のフォームベース認証に加え、LaravelはLaravel Socialiteを使ってOAuthプロバイダーでの認証を簡単かつ便利に行う方法を提供します。Socialiteは現在、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucket、Slackでの認証をサポートしています。
他のプラットフォーム用のアダプターは、コミュニティ主導のSocialite Providersサイトで入手できます。
#インストール
Socialiteを始めるには、Composerパッケージマネージャーを使ってプロジェクトの依存関係にパッケージを追加してください。
composer require laravel/socialite
#Socialiteのアップグレード
Socialiteの新しいメジャーバージョンにアップグレードする際は、アップグレードガイドをよく確認してください。
#設定
Socialiteを使う前に、アプリケーションで利用するOAuthプロバイダーの認証情報を追加する必要があります。通常、これらの認証情報は認証に使うサービスのダッシュボードで「開発者アプリケーション」を作成して取得します。
これらの認証情報はアプリケーションのconfig/services.php設定ファイルに配置し、アプリケーションが必要とするプロバイダーに応じてfacebook、twitter(OAuth 1.0)、twitter-oauth-2(OAuth 2.0)、linkedin-openid、google、github、gitlab、bitbucket、slackのキーを使います。
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'http://example.com/callback-url',
],
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');
});
特定の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アクセストークンタイプの両方に対応しています。
- 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();
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プロバイダーの場合...
$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();
});
#トークンからユーザー情報を取得する(OAuth2)
すでに有効なアクセストークンを持っている場合は、SocialiteのuserFromTokenメソッドでユーザー情報を取得できます。
use Laravel\Socialite\Facades\Socialite;
$user = Socialite::driver('github')->userFromToken($token);
#トークンとシークレットからユーザー情報を取得する(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();
TwitterのOAuth 1.0ドライバーではステートレス認証は利用できません。