Laravel 9.x Laravel Socialite

イントロダクション

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(OAuth1.0)、twitter-oauth-2(OAuth 2.0)、linkedingooglegithubgitlabbitbucketで、アプリケーションで必要なプロバイダによります。

'github' => [
    'client_id' => env('GITHUB_CLIENT_ID'),
    'client_secret' => env('GITHUB_CLIENT_SECRET'),
    'redirect' => 'http://example.com/callback-url',
],

Tip!! 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');
});

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メソッド使用時は、stateresponse_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: Twitter OAuth.0ドライバでは、ステートレス認証は利用できません。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる