この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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\LoginServiceProvider
のregister()
メソッドを確認すると、
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.php
のregister()
メソッドに下記を追加します。
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.php
のproviders
を下記のようにします。
'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.php
のlogout()
メソッドで指定する値が下記のようになっておりますので、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の認証機能を統合できることが確認できました。