tobibako45 / laravel-auth0-practice

1 stars 0 forks source link

Laravel6でAuth0をやる #1

Open tobibako45 opened 4 years ago

tobibako45 commented 4 years ago

Auth0 PHP(Laravel)SDKクイックスタート:ログイン

auth0-laravel-php-web-app/01-Login at master · auth0-samples/auth0-laravel-php-web-app

config/laravel-auth0.phpの作成と設定 コレがわかりやすい

Auth0 を使ってユーザログインを実装する - Qiita

(https://auth0.com/docs/quickstart/webapp/laravel) Laravel 6.0の新機能

tobibako45 commented 4 years ago

前提

2

3

の2つと、

Auth0でのアプリケーション登録

.envで

APP_URL=http://localhost:8000

とか

ができてることが前提

tobibako45 commented 4 years ago

Auth0プラグインとその依存関係をインストールする

このプラグインをインストールするには

$ composer require auth0/login

これによりインストールされます:

Auth0 PHP SDKでvendor\auth0\auth0-php Auth0 Laravelプラグインでvendor\auth0\login

LaravelでAuth0ログインを有効にする

tobibako45 commented 4 years ago

LaravelでAuth0ログインを有効にする

サービスプロバイダーに登録。

まず、Auth0サービスを以下のプロバイダーのリストに追加する必要があります。

config/app.php

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

Auth0をファサードに登録

Auth0ファサードを使用する場合は、同じファイルにエイリアスを追加します(必須ではありません)

config/app.php

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

AppServiceProvider::register()メソッドに追加

最後に、ユーザーがログインするたび、またはJWTがデコードされるたびに、アプリのユーザーモデルを提供するクラスをバインドする必要があります。Auth0UserRepositoryこのパッケージで提供されているものを使用するか、独自のパッケージを作成できます(以下の「カスタムユーザー処理」セクションを参照)。

AppServiceProvider::register()メソッドに次を追加します。

app/Providers/AppServiceProvider.php

// ...
class AppServiceProvider extends ServiceProvider
{
    // ...
    public function register()
    {
        $this->app->bind(
            \Auth0\Login\Contract\Auth0UserRepository::class,
            \Auth0\Login\Repository\Auth0UserRepository::class
        );
    }
}
tobibako45 commented 4 years ago

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

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

次のコマンドでデフォルトの構成ファイルを公開します。

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.

.envの設定

.env

// ...
AUTH0_DOMAIN=<Auth0で取得したDomain>
AUTH0_CLIENT_ID=<Auth0で取得したClient_ID>
AUTH0_CLIENT_SECRET=<Auth0で取得したClient_Secret>

ではlaravel-auth0.php、グローバルヘルパーenv()を使用してこれらの値を取得し、Laravelアプリにロードします。

tobibako45 commented 4 years ago

ルートを設定する

プラグインは、Auth0サーバーからの認証データを処理するコールバックルートを作成することにより、Laravel認証システムと連携します。

まず、ルートとコントローラーをに追加しますroutes/web.php。ここで使用されるルートは、redirect_uri以前に設定された構成オプションと一致する必要があります。

routes/web.php

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

ここでこのコールバックURLをロードすると、404エラーが表示されるのではなく、すぐにホームページにリダイレクトされます。これにより、ルートがセットアップされ、処理されていることがわかります。

次に、このURLを、このアプリで使用するアプリケーションの[アプリケーション設定]画面の[ 許可されたコールバックURL]フィールドに追加する必要があります

tobibako45 commented 4 years ago

ログアウト

最後に、ユーザーがアプリにログインおよびログアウトする方法を設定する必要があります。 これは、 前者(ログイン)についてはユーザーをAuth0にリダイレクトし、 後者(ログアウト)についてはセッションデータを消去することで処理されます。

汎用ルート処理コントローラーを作成することから始めましょう。

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 profile email',
            // 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',
            config('laravel-auth0.domain'),
            config('laravel-auth0.client_id'),
            url('/')
        );
        return  \Redirect::intended($logoutUrl);
    }
}

次に、適切なハンドラーメソッドに結び付けられたルートを、 使用可能な名前とauth必要なミドルウェアとともに追加します。

routes/web.php

// ...
Route::get( '/login', 'Auth\Auth0IndexController@login' )->name( 'login' );
Route::get( '/logout', 'Auth\Auth0IndexController@logout' )->name( 'logout' )->middleware('auth');
tobibako45 commented 4 years ago

Laravel認証システムと統合する

Laravelの認証システムが必要とユーザオブジェクトによって与えられたユーザプロバイダを。 これら2つの抽象化により、ユーザーエンティティは任意の構造を持つことができ、どこにでも保存できます。 でユーザープロバイダーを選択して、ユーザープロバイダーを間接的に構成しますconfig/auth.php。 デフォルトのプロバイダーはEloquentで、ORMを使用してデータベースにユーザーモデルを保持します。

プラグインには、Auth0によって定義されauth0た正規化ユーザープロファイルをラップするユーザー構造を定義する認証ドライバーが付属しています。 このドライバーは実際にユーザーを永続化するのではなく、将来の呼び出しのためにセッションに保存するだけです。 これは基本的なテストや、ユーザーを永続化する必要がない場合にうまく機能します。 データベースの永続性については、以下の「カスタムユーザー処理」セクションを参照してください。

いつでも呼び出しAuth::check()て、ログインしているユーザーがいるかどうかを確認Auth::user()し、ユーザー情報を含むラッパーを取得できます。

次のようconfig/auth.phpに使用するauth0ようにユーザードライバーを構成します。

config/auth.php

// ...
'providers' => [
    'users' => [
        'driver' => 'auth0'
    ],
],
tobibako45 commented 4 years ago

ログインおよびログアウトリンクを追加する

これをすべてテストするには、これらのルートにアクセスするためのリンクをサイトに追加しましょう。 デフォルトのプロジェクトを使用している場合は、開いてブロックresources/views/welcome.blade.phpを探します@if (Route::has('login'))。 そのブロックを次のように変更します。

resources/views/welcome.blade.php

@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ログインページにリダイレクトされます。 これが発生しない場合、次の2つのいずれかが表示されます。

Laravelデバッグ画面(はAPP_DEBUGに設定されていますtrue)は、上記の手順とともに、問題の診断に役立ちます 「技術的詳細」の見出しの下に詳細が記載されたAuth0エラーページ(このエラーの詳細を見るをクリックします) ログインに成功すると、ホームページにリダイレクトされ、右上にログアウトリンクが表示されます。 これにより、ログインプロセスが成功し、Auth0ユーザープロバイダーが適切に機能していることがわかります。[ ログアウト]をクリックすると、開始した場所に戻るはずです。

この時点で、Auth0を使用した完全に機能する認証プロセスが必要です。

tobibako45 commented 4 years ago

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' );

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

Auth::user()の確認

jsonが返ってくる

UserInfoの取得

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