Auth0をPHP (Laravel)で使ってみる

Auth0のPHP (Laravel)チュートリアルをやってみましたので、その内容を書いていきます。

Auth0 PHP (Laravel)

前提

  • Auth0のサインアップが完了していること

Auth0アプリケーションの作成

今回はAuth0のサインアップ後にデフォルトで作成されているアプリケーションを使うことにします。

サンプルアプリケーションの作成

Laravelプロジェクトを作成します。

laravel new auth0-sample

あとで.envファイルが必要になりますが、既に作成されておりますので新規作成は不要です。

Auth0 pluginとSDKのインストール

作成したプロジェクトのディレクトリへ移動します。

cd auth0-sample

下記を実行します。

composer require auth0/login:"~5.0"

完了すると、下記のライブラリが追加されます。

  • Auth0 PHP SDK
    • vendor\auth0\auth0-php
  • Auth0 Laravel plugin
    • vendor\auth0\login

Auth0を使うための準備

Auth0サービスをLaravelのサービスプロバイダーに登録

config/app.phpに下記を追加します。

    'providers' => [
        ・・(略)・・
        /**
         * Auth0
         */
        Auth0\Login\LoginServiceProvider::class,

Auth0\Login\LoginServiceProviderregister()メソッドを確認すると、 Auth0サービスがLaravelのサービスコンテナへ登録されるようになっております。 また、Laravelのログアウトイベントをイベントリスナーに登録し、Auth0のログアウト処理が呼び出されるようになっております。

    ・・(略)・・
    public function register()
    {
        // Bind the auth0 name to a singleton instance of the Auth0 Service
        $this->app->singleton('auth0', function () {
          return new Auth0Service();
        });

        // When Laravel logs out, logout the auth0 SDK trough the service
        \Event::listen('auth.logout', function () {
            \App::make('auth0')->logout();
        });
        \Event::listen('user.logout', function () {
            \App::make('auth0')->logout();
        });
        \Event::listen('Illuminate\Auth\Events\Logout', function () {
            \App::make('auth0')->logout();
        });
    }
    ・・(略)・・

Auth0ファサードの登録

必須では無いですが、ファサードを使う場合に備えて、config/app.phpに下記を追加しておきます。

    'aliases' => [
        ・・(略)・・
        /**
         * Auth0
         */
        'Auth0' => Auth0\Login\Facade\Auth0::class,

Auth0UserRepositoryの登録

認証済みユーザーを格納するためのクラスを登録します。 app/Providers/AppServiceProvider.phpregister()メソッドに下記を追加します。

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // Auth0
        $this->app->bind(
            \Auth0\Login\Contract\Auth0UserRepository::class,
            \Auth0\Login\Repository\Auth0UserRepository::class
        );
    }

config/laravel-auth0.phpの作成と設定

下記を実行します。

$ php artisan vendor:publish

下記のようなメッセージが表示され、入力を求められます。

 
 Which provider or tag's files would you like to publish?:
  [0 ] Publish files from all providers and tags listed below
  [1 ] Provider: Auth0\Login\LoginServiceProvider
  [2 ] Provider: BeyondCode\DumpServer\DumpServerServiceProvider
  [3 ] Provider: Fideloper\Proxy\TrustedProxyServiceProvider
  [4 ] Provider: Illuminate\Foundation\Providers\FoundationServiceProvider
  [5 ] Provider: Illuminate\Mail\MailServiceProvider
  [6 ] Provider: Illuminate\Notifications\NotificationServiceProvider
  [7 ] Provider: Illuminate\Pagination\PaginationServiceProvider
  [8 ] Provider: Laravel\Tinker\TinkerServiceProvider
  [9 ] Tag: config
  [10] Tag: laravel-errors
  [11] Tag: laravel-mail
  [12] Tag: laravel-notifications
  [13] Tag: laravel-pagination
 >

Auth0\Login\LoginServiceProviderを選択するので、1を入力してEnter。

  > 1

Publishing complete.と表示されればOKです。

Copied File [/vendor/auth0/login/src/config/config.php] To [/config/laravel-auth0.php]
Publishing complete.

config/laravel-auth0.phpが作成されていることを確認します。

.envファイルの設定

.envファイルに下記を追加して値を設定します。

// Auth0
AUTH0_DOMAIN=YOUR_DOMAIN
AUTH0_CLIENT_ID=YOUR_CLIENT_ID
AUTH0_CLIENT_SECRET=YOUR_CLIENT_SECRET

値はAuth0管理画面のApplications > Settingsで確認できます。

Auth0サーバーからコールバックを受けるためのルーティング設定

Auth0サーバーからコールバックを受けるためのルーティング設定を行います。

routes/web.phpに下記を追加します。

// Auth0
Route::get( '/auth0/callback', '\Auth0\Login\Auth0Controller@callback' )->name( 'auth0-callback' );

ログイン、ログアウト処理を行うためのコントローラー作成

下記を実行し、コントローラーファイルを作成します。

php artisan make:controller Auth/Auth0IndexController

作成されたapp/Http/Controllers/Auth/Auth0IndexController.phpを下記ののようにします。

class Auth0IndexController extends Controller
{
    /**
     * Redirect to the Auth0 hosted login page
     * 
     * @return mixed
     */
    public function login()
    {
        $authorize_params = [
            'scope' => 'openid email email_verified',
            // Use the key below to get an Access Token for your API.
            // 'audience' => config('laravel-auth0.api_identifier'),
        ];
        return \App::make('auth0')->login(null, null, $authorize_params);
    }

    /**
     * Log out of Auth0
     * 
     * @return mixed
     */
    public function logout()
    {
        \Auth::logout();
        $logoutUrl = sprintf(
            'https://%s/v2/logout?client_id=%s&returnTo=%s',
            env('AUTH0_DOMAIN'),
            env('AUTH0_CLIENT_ID'),
            env('APP_URL'));
        return  \Redirect::intended($logoutUrl);
    }
}

login()メソッドとlogout()メソッドのためのルーティング設定を行うため、routes/web.phpに下記を追加します。

Route::get('/login', 'Auth\Auth0IndexController@login' )->name( 'login' );
Route::get('/logout', 'Auth\Auth0IndexController@logout' )->name( 'logout' )->middleware('auth');

Laravelの認証機能との統合

config/auth.phpprovidersを下記のようにします。

    'providers' => [
        //'users' => [
        //    'driver' => 'eloquent',
        //    'model' => App\User::class,
        //],
        
        'users' => [
            'driver' => 'auth0'
        ],        

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

サンプル画面にログイン、ログアウトのリンクを設定

resources/views/welcome.blade.php@if (Route::has('login'))部分を下記のようにします。

    <body>
        <div class="flex-center position-ref full-height">
            @if (Route::has('login'))
                <div class="top-right links">
                    @auth
                        <a href="{{ route('logout') }}">Logout</a>
                    @else
                        <a href="{{ route('login') }}">Login/Signup</a>
                    @endauth
                </div>
            @endif

Auth0のアプリケーション設定

管理画面のアプリケーション設定を行います。

今回のサンプルアプリケーションの場合は、下記のようになります。

  • Allowed Callback URLs
    • https://{ドメイン}/auth0/callback
  • Application Login URI
    • https://{ドメイン}/login
  • Allowed Logout URLs
    • https://{ドメイン}/

Logout URLの設定値について

この値はログアウト処理のエンドポイントのreturnToパラメーターに付与される値になります。 app/Http/Controllers/Auth/Auth0IndexController.phplogout()メソッドで指定する値が下記のようになっておりますので、env('APP_URL')が渡されます。

その為、Allowed Logout URLsの値をhttps://{ドメイン}/にしております。

    public function logout()
    {
        \Auth::logout();
        $logoutUrl = sprintf(
            'https://%s/v2/logout?client_id=%s&returnTo=%s',
            env('AUTH0_DOMAIN'),
            env('AUTH0_CLIENT_ID'),
            env('APP_URL'));
        return  \Redirect::intended($logoutUrl);
    }

サンプルアプリケーションのデプロイ

サンプルアプリケーションは、サーバーなどにデプロイしてください。

試してみる

未ログイン状態

画面右上の表示がLOGIN/SIGNUPになってます。

ログイン処理を行う

画面右上のLOGIN/SIGNUPをクリックします。 すると、Auth0で提供されるログイン画面が表示されました。

サインアップする

まだログインできるユーザーがいないので、サインアップしてみます。

サインアップ完了&ログイン状態

画面右上の表示がLOGOUTになってます。

ログアウト処理

画面右上のLOGOUTをクリックすると、ログアウト処理が行われて、returnToパラメーターに指定されるhttps://{ドメイン}/に戻ってきます。

LaravelのAuthファサードで認証確認と認証済みユーザーの取得

Authファサードを下記のように使用することで、認証確認と認証済みユーザーの取得ができます。

  • Auth::check()
    • 認証済みかどうかの確認
  • Auth::user()
    •  認証済みユーザーの情報

確認準備

今回はそれぞれの処理結果を出力するだけのコントローラーを作成します。

php artisan make:controller Auth0TestController

app/Http/Controllers/Auth0TestController.phpを下記のようにします。

class Auth0TestController extends Controller
{
    public function authCheck()
    {
        echo \Auth::check();
    }

    public function authUser()
    {
        echo \Auth::user();
    }    
}

routes/web.phpに下記を追加します。

Route::get('/auth-check', 'Auth0TestController@authCheck' );
Route::get('/auth-user', 'Auth0TestController@authUser' );

Auth::check()の確認

認証済みだとtrue(1)が返ってきます。

Auth::user()の確認

こんなふうに情報を取得できます。

UserInfoの取得

このようにすることで取得できます。

    public function getUser()
    {
        $userinfo = \App::make('auth0')->getUser();
        echo json_encode($userinfo);
    }   

おわりに

今回はAuth0をPHP(Laravel)で使用する場合のチュートリアルを通して、Auth0とLaravelの認証機能を統合できることが確認できました。