Laravel Socialite
はじめに
通常のフォームベースの認証に加えて、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
、または slack-openid
のキーを使用する必要があります。
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect' => 'http://example.com/callback-url',
],
もし redirect
オプションに相対パスが含まれている場合、それは自動的に完全修飾 URL に解決されます。
認証
ルーティング
OAuth プロバイダを使用してユーザーを認証するには、ユーザーを 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');
});
特定の 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 アクセストークンタイプの両方と互換性があります:
<div class="content-list" markdown="1">
- ボット(`xoxb-` で始まる)
- ユーザー(`xoxp-` で始まる)
</div>
デフォルトでは、`slack` ドライバーは `user` トークンを生成し、ドライバーの `user` メソッドを呼び出すとユーザーの詳細が返されます。
アプリケーションが、アプリケーションのユーザーが所有する外部 Slack ワ ークスペースに通知を送信する場合は、ボットトークンが主に役立ちます。ボットトークンを生成するには、ユーザーを Slack に認証する前に `asBotUser` メソッドを呼び出してください:
```php
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();
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();
});
トークンからユーザーの詳細を取得(OAuth2)
ユーザーの有効なアクセストークンをすでに持っている場合、Socialiteの `userFromToken` メソッドを使用して、ユーザーの詳細を取得できます:
```php
use Laravel\Socialite\Facades\Socialite;
$user = Socialite::driver('github')->userFromToken($token);
Facebook Limited LoginをiOSアプリケーション経由で使用している場合、Facebookはア クセストークンの代わりにOIDCトークンを返します。アクセストークンと同様に、OIDCトークンを userFromToken
メソッドに提供して、ユーザーの詳細を取得できます。
トークンとシークレットからユーザーの詳細を取得する(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 ドライバーでは、無状態認証は利用できません。