2019.05.01

【クラウド認証サービス】「Auth0」使ってみた


最近、Auth0を知る機会がありました。
とても便利なクラウドサービスのようなので、Laravelでの実装を例に使用した感想を書いてみたいと思います。

また、本記事では既にプロジェクト作成済みの想定で、Auth0のセットアップを記載しています。Laravelプロジェクトの作成方法については、本サイトのチュートリアルを是非ご覧ください。 入門Laravelチュートリアル (1)

Auth0について

Auth0とは?

Auth0 はWebやモバイル、レガシーアプリケーションやAPIなどに向けた認証・認可の機能を提供している総合認証プラットフォームで、いわゆるIDaaS (Identity as a Service)ベンダーです。

なにがいいの?

アプリケーションに、ユーザー認証やセキュリティを組み込むことは今のサービスには必須になってきています。
実装する際も、Webやモバイル、APIとの連携、シングルサインオンで複数アプリでのID管理など複雑化してきており、認証方法もGoogle・Facebook・Twitter・Lineなど様々あり、個別で設定が必要でした。
ですが、Auth0では複雑な設定を1つにまとめることで、実装のコストを抑えて管理のしやすいソリューションを提供してくれています。

対応範囲

従来の認証機能サービスとの大きな違いは、対応範囲にあるようです。
OpenID ConnectJsonWebToken(JWT)ベースの認証方法を採用しており、言語も600語以上に対応しています。
また、lotなど様々なプラットフォームにも対応しているため、SSO(シングルサインオン)などの導入にも効果的です。

対応している認証アプリ
・GitHub,Twitter,Facebook,Google、etc...(iphoneの指紋認証にまで対応しているそうな)。

では、実際にAuth0をセットアップしてみたいと思います。

Auth0をセットアップしてみよう

まずは公式サイトにてアカウント作成を行います。
Auth0 - 公式サイト

letters

無料トライアル、またはSign Upボタンよりメールアドレスで登録か、Github, Google, Microsoftアカウントを既にお持ちでしたらそちらで作成も可能です。

letters

サインアップが完了しログインしたら、テナントドメインの作成画面になります。
ここでAuth0のドメイン名とドメインを登録する地域を選択します(※ドメイン名は一度設定したら変更ができないようです) 。今回は適当なドメイン名で地域は「US:米国」を選択してみました。完了したら、Nextをクリックします。

letters

次にTell Us More画面に写るので、使用用途などアンケートを入力し、Create Accountボタンをクリックします。

letters

すると、アカウント作成が完了しAuth0のダッシュボード画面が表示されました。

letters

以上で、アカウントの作成は完了です。

Laravelにセットアップしてみよう

では、実際にLaravelアプリケーションにユーザーログインを追加してみたいと思います。
※すでにLaravelプロジェクトを作成し、ローカルまたはテストサーバー上で稼働済みの想定で進めています。

Auth0の設定

Auth0とLaravelを通信するには、アプリケーションに関するいくつかの詳細が必要になります。
そこで、ダッシュボードメニューより「Applications」を選択し、「Create App」よりアプリケーションキーを新規作成します(今回は、デフォルトで作成済みのキーを使用)。
そちらに記載されているドメイン、クライアントID、パスワードの情報が必要になります。

letters

コールバックURLの設定

コールバックURLは、認証後にAuth0がユーザーをリダイレクトするURLになるので、設定の追加が必要です。ログアウトURLも同様に設定しましょう。
今回は、ローカル開発のURLを有効に設定しました。

letters

お疲れ様です!以上でAuth0側の設定は完了です。次にLaravel側で設定を行っていきたいと思います。

Laravelの設定

まずは、先ほど作成したアプリケーションに記載されているドメイン,ID,パスワードをLaravelアプリケーションの.envに追加します。

AUTH0_DOMAIN="ここにドメイン(xxx.auth0.com)"
AUTH0_CLIENT_ID="ここにクライアントID"
AUTH0_CLIENT_SECRET="ここにパスワード"

Auth0プラグインをインストール

下記コマンドで、Auth0のプラグインをインストールします。

$ composer require auth0/login:"~5.0"

インストールが完了すると、2つのプラグインが追加されているかと思います。

  • vendor\auth0\auth0-php
  • vendor\auth0\login

Auth0ログインを有効にする

Auth0のサービスを、プロバイダーに追加します。

// config/app.php

'providers' => array(
    // ...
    Auth0\Login\LoginServiceProvider::class,
);

Auth0ファサードも用意されているので、必要な場合は同ファイルに別名を追加します。
(ファサードの詳細についてはこちらをご覧ください)

// config/app.php

'aliases' => [
    // ...
    'Auth0' => Auth0\Login\Facade\Auth0::class,
];

次に、ユーザーがログインするかJWTがデコードされるたびに、アプリのユーザーモデルを提供するクラスをバインドするよう設定します。今回は、AppServiceProvider::register()メソッドに下記を追加しました。

public function register(): void
    {
        $this->app->bind(
            \Auth0\Login\Contract\Auth0UserRepository::class,
            \Auth0\Login\Repository\Auth0UserRepository::class
        );
    }

また、プラグインを設定するには、config/laravel-auth0.phpファイルを作成し公開する必要があるようです。Auth0アカウントからの情報と実装の詳細を使用してファイルを完成させます。

次のコマンドを入力します。

$ php artisan vendor:publish

すると、config/laravel-auth0.phpが作成され、デフォルトの設定ファイルが公開されました。

先ほど.envに設定した、Auth0の接続情報をこちらのファイルに記述していきます。
.envに機密データを記述することは、バージョン管理の対象外に保たれ、様々なテストおよび本番環境での使用が可能となるため、このように環境固有の変数ロードをすることをお勧めします。

// config/laravel-auth0.phpの一部抜粋

return array(
    // ...
    'domain'        => env( 'AUTH0_DOMAIN' ),
    // ...
    'client_id'     => env( 'AUTH0_CLIENT_ID' ),
    // ...
    'client_secret' => env( 'AUTH0_CLIENT_SECRET' ),
    // ...
);

ルートを設定

Auth0サーバーからのコールバックで、Laravel認証システムと連携させたいと思います。
まずは、ルートとコントローラーを追加します。ここで追加するルートは、先ほどAuth0の設定オプションに追加した、redirect_uriと一致するよう設定します。

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

最後に、ログインとログアウトの設定を追加します。
ログインの場合は、ユーザーをAuth0にリダイレクト。ログアウトの場合はセッションデータを削除することにより処理されるようです。
Laravelコマンドでコントローラーを作成してみましょう。

$ php artisan make:controller Auth/Auth0IndexController

作成ができたら、ログインとログアウトの関数を追加します。

class Auth0IndexController extends Controller
{
    public function login()
    {
        $authorize_params = [
            'scope' => 'openid email email_verified',
        ];
        return \App::make('auth0')->login(null, null, $authorize_params);
    }

    public function logout()
    {
        \Auth::logout();
        return \Redirect::intended('/');
    }
}

関数を追加したら、ルートとAuth、必要な場合は使用可能なミドルウェア名を追加します。

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

Laravel認証システムとの統合

Laravelのユーザー認証は、ユーザーエンティティを任意の形の構造にし、格納することができる仕様になっています。config/auth.phpを確認すると、デフォルトではEloquentとデータベースクエリービルダーを使用してユーザーを取得するよう設定されています。
こちらはアプリ毎にカスタム可能なので、今回はプラグインでAuth0のプロバイダを追加設定します。これによりAuth::check()Auth::user()等のおなじみの記述で、Auth0経由でログインされたユーザーを参照できます。

// config/auth.php
// ...
'providers' => [
    'users' => [
        'driver' => 'auth0'
    ],
],

お疲れ様でした👏
以上で基本的な設定は完了なので、実際にログインをしてみたいと思います!

検証

プロジェクトTOPページのログインボタンをクリックします。

letters

すると、Auth0のログイン画面へ遷移することができました。デフォルトなのでメールアドレス、またはgoogleアカウントでのログイン選択となっていますが、Auth0のダッシュボード上でFacebookやTwitter等の追加も可能です。

letters

デフォルトのログイン後画面なので分かりにくいですが、ヘッダーのログインボタンが「ログアウト」に変わっているので、正常にログインをすることができたようです。

letters

最後に、Auth0ダッシュボードでユーザーのログイン情報を見てみましょう。

ダッシュボードメニューより「Users & Roles」を選択し、usersを参照します。すると、先ほどログインしたユーザー情報が表示されました。

letters

無料トライアルについて

Auth0は有料版のあるサービスになります。
(無料トライアル期間は22日間(期間中、作成されたテナントは有料版と同じ機能が使用可能。無料トライアル期間が終了すると、テナントは一部機能が制限されたFreeライセンスに移行しますが、そのまま使用し続けることは可能です。詳しくは、https://auth0.com/pricing をご参照ください。
無料版でも、カスタマイズやユーザー数に制限はあるものの、ある程度の規模までは対応できそうです。

感想

実際に検証してみて、良いと感じた点です。

  • ユーザーのログイン履歴をAuth0のダッシュボードで確認できる。
  • メールアドレスとパスワードでのログインをAuth0の管理DBでサポートしていて、SignUp時のメール確認フローもある。
  • 対応ソーシャルアプリが30個以上ある。
  • テスト環境ではソーシャルアプリ側にOAuthアプリの登録不要。
  • 周辺機能の多くがオープンソースでGitHub上に公開されている。

などなど。
また、ユーザーに管理者用の権限をロールで付与や、mysql等のDBをAuth0に追加、複数アプリでユーザー情報を共有・参照など設定も可能です。 認証周りの実装時間を大幅削減できるかもしれません。

以上、簡単ではありますがLaravelプロジェクトにAuth0をセットアップする手順でした。
是非本記事をきっかけに試して頂けたら幸いです。


<!-- Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com --><!-- License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) -->