仮想通貨ブログに専念するため、たまーに更新します!仮想通貨ブログはこちら!

【Laravel】AWS Cognito利用方法!サインアップするで!

  • URLをコピーしました!
悩んでいる男の子

LaravelでCognitoの処理を書いてみたいんだけど、全然わからないんだよね。。

こんな悩みを解決します。

  • 本記事の内容
  • LaravelでCognitoの処理を書く方法
  • 本記事の執筆者
いずみん(@izumin_0401)

今回は、LaravelでのCognito利用方法を解説します。

いずみん

本記事を読めばLaravelでのCognitoの利用方法が理解できるので、是非最後まで読んでみてください!

プログラミングを学びたい方必見!

オンライン特化のプログラミングスクールなら「」が超おススメ!

副業としてプログラミングを学びたい方にもおすすめのスクールです!

  • 初心者が9割以上なので挫折せずに学べる!
  • 受講者に副業の仕事を1案件以上斡旋! ※条件あり
  • オンライン完結型なので、在宅でもお仕事可!
  • プロのメンターがサポートしてくれる!

キャリアカウンセリングメンター相談無料でできるのもおすすめポイントです!

目次

Laravel×Cognitoの前提条件

  • Laravelプロジェクトが作成されていること

Laravel×Cognito利用方法

Cognitoを利用するには、ライブラリをインストールする必要があります。

「aws/aws-sdk-php:3.*」ライブラリをインストール

composer require aws/aws-sdk-php:3.*

Laravel×Cognito実装

定数設定

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Application Name
    |--------------------------------------------------------------------------
    |
    | This value is the name of your application. This value is used when the
    | framework needs to place the application's name in a notification or
    | any other location as required by the application or its packages.
    |
    */

    'name' => env('APP_NAME', 'Laravel'),

    /*
    |--------------------------------------------------------------------------
    | Application Environment
    |--------------------------------------------------------------------------
    |
    | This value determines the "environment" your application is currently
    | running in. This may determine how you prefer to configure various
    | services the application utilizes. Set this in your ".env" file.
    |
    */

    'env' => env('APP_ENV', 'production'),

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => env('APP_URL', 'http://localhost'),

    'asset_url' => env('ASSET_URL', null),

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Faker Locale
    |--------------------------------------------------------------------------
    |
    | This locale will be used by the Faker PHP library when generating fake
    | data for your database seeds. For example, this will be used to get
    | localized telephone numbers, street address information and more.
    |
    */

    'faker_locale' => 'en_US',

    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | This key is used by the Illuminate encrypter service and should be set
    | to a random, 32 character string, otherwise these encrypted strings
    | will not be safe. Please do this before deploying an application!
    |
    */

    'key' => env('APP_KEY'),

    'cipher' => 'AES-256-CBC',

    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Arr' => Illuminate\Support\Arr::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'Str' => Illuminate\Support\Str::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,

    ],

    /*
    |--------------------------------------------------------------------------
    | カスタマイズ定数
    |--------------------------------------------------------------------------
    */

    'aws_library_version' => '2016-04-18',
    'aws_region'          => 'ap-northeast-1',
    'aws_user_pool_id'    => 'ap-northeast-1_*****',
    'aws_client_id'       => '********************',
    'aws_access_key'      => '********************',
    'aws_secret_key'      => '*****************************',

];

config\app.php」を上記のように編集します。

いずみん

これから使用する定数を用意しておきます。

ルーターサービスプロバイダー設定

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //

        parent::boot();
    }

    /**
     * Define the routes for the application.
     *
     * @return void
     */
    public function map()
    {
        $this->mapApiRoutes();

        $this->mapWebRoutes();

        // Cognito用ルーティング
        $this->mapCognitoRoutes();
    }

    /**
     * Define the "web" routes for the application.
     *
     * These routes all receive session state, CSRF protection, etc.
     *
     * @return void
     */
    protected function mapWebRoutes()
    {
        Route::middleware('web')
             ->namespace($this->namespace)
             ->group(base_path('routes/web.php'));
    }

    /**
     * Define the "api" routes for the application.
     *
     * These routes are typically stateless.
     *
     * @return void
     */
    protected function mapApiRoutes()
    {
        Route::prefix('api')
             ->middleware('api')
             ->namespace($this->namespace)
             ->group(base_path('routes/api.php'));
    }

    /**
     * Define the "cognito" routes for the application.
     *
     * @return void
     */
    protected function mapCognitoRoutes()
    {
        Route::prefix('cognito')
            ->middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/cognito.php'));
    }
}

app\Providers\RouteServiceProvider.php」を上記のように編集します。

これで、新規作成するルーティングファイルが有効になります。

ルーティングファイル新規作成

<?php

/* ユーザ一覧取得 */
Route::get('/listUsers', 'CognitoController@listUsers');

/* サインアップ */
Route::post('/signUp', 'CognitoController@signUp');

/* 認証コード確認 */
Route::post('/confirmSignup', 'CognitoController@confirmSignup');

routes\cognito.php」を新規作成し、上記のように編集します。

今回は、「ユーザー一覧取得」「サインアップ」「認証コード確認」の3つを実装します。

コントローラ新規作成

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\CognitoService;

class CognitoController extends Controller
{
    private $cognito_service;

    public function __construct(CognitoService $cognito_service)
    {
        $this->cognito_service = $cognito_service;
    }

    /**
     * ユーザ一覧取得API
     *
     * @return ユーザ一覧
     */
    public function listUsers(): array
    {
        return $this->cognito_service->listUsers();
    }

    /**
     * サインアップAPI
     *
     * @param $request フォームリクエスト(JSON形式)
     */
    public function signUp(Request $request): void
    {
        $this->cognito_service->signUp($request["username"], $request["email"], $request["password"]);
    }

    /**
     * 認証コード確認API
     *
     * @param $request フォームリクエスト(JSON形式)
     */
    public function confirmSignup(Request $request): void
    {
        $this->cognito_service->confirmSignup($request["username"], $request["confirmation_code"]);
    }
    
}

app\Http\Controllers\CognitoController.php」を新規作成し、上記のように編集します。

サービスプロバイダ設定

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Services\CognitoService');
        $this->app->bind('App\Services\CognitoErrorService');
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

app\Providers\AppServiceProvider.php」を上記のように編集します。

ControllerでサービスをDIするために必要な設定です。

CognitoService新規作成

<?php

namespace App\Services;

use Illuminate\Support\Facades\Log;
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use App\Services\CognitoErrorService;

class CognitoService
{
    /* AWS関連 */
    private $version;      // AWSライブラリバージョン
    private $region;       // AWSリージョン
    private $user_pool_id; // AWS CognitoユーザプールID
    private $client_id;    // AWS CognitoアプリクライアントID
    private $access_key;   // AWS IAMアクセスキー
    private $secret_key;   // AWS IAMシークレットキー
    private $client;       // CognitoIdentityProviderClient

    /* サービス */
    private $cognito_error_service; // Cognitoエラー用サービス

    /**
     * コンストラクタ
     */
    public function __construct(CognitoErrorService $cognito_error_service)
    {
        /* AWS関連 */
        $this->version               = config('app.aws_library_version');
        $this->region                = config('app.aws_region');
        $this->user_pool_id          = config('app.aws_user_pool_id');
        $this->client_id             = config('app.aws_client_id');
        $this->access_key            = config('app.aws_access_key');
        $this->secret_key            = config('app.aws_secret_key');

        /* サービス */
        $this->cognito_error_service = $cognito_error_service;
    }

    /**
     * 初期化処理
     */
    private function init(): void
    {
        $this->client = new CognitoIdentityProviderClient([
            'version' => $this->version,
            'region'  => $this->region,
        ]);
    }

    /**
     * 初期化処理
     * ※認証(アクセスキー・シークレットキー)が必要な関数を使う場合に利用する
     */
    private function initCredentials(): void
    {
        $this->client = new CognitoIdentityProviderClient([
            'version' => $this->version,
            'region'  => $this->region,
            'credentials' => [
                'key'    => $this->access_key,
                'secret' => $this->secret_key,
            ],
        ]);
    }

    /**
     * ユーザ一覧を取得する
     *
     * @return (指定したユーザプールの)ユーザ一覧
     */
    public function listUsers(): array
    {
        try {
            $this->initCredentials();

            $result = $this->client->listUsers([
                'UserPoolId' => $this->user_pool_id,
            ])->get('Users');
        } catch (\Exception $e) {
            Log::error($e);
            throw $e;
        }

        return $result;
    }

    /**
     * サインアップを行う
     *
     * @param $username Cognitoユーザ:ユーザ名
     * @param $email    Cognitoユーザ:メールアドレス
     * @param $password Cognitoユーザ:パスワード
     */
    public function signUp(string $username, string $email, string $password): void
    {
        try {
            $this->init();

            $this->client->signUp([
                'ClientId' => $this->client_id,
                'Username' => $username,
                'Password' => $password,
                'UserAttributes' => [
                    [
                        'Name'  => 'email',
                        'Value' => $email
                    ]
                ],
            ]);
        } catch (\Exception $e) {
            $this->cognito_error_service->signUp($e);
            throw $e;
        }
    }

    /**
     * 認証コード確認を行う
     *
     * @param $username         Cognitoユーザ:ユーザ名
     * @param $confirmationCode サインアップ後、Cognitoから発行された認証コード
     */
    public function confirmSignup(string $username, string $confirmationCode): void
    {
        try {
            $this->init();

            $result = $this->client->confirmSignUp([
                'ClientId'         => $this->client_id,
                'Username'         => $username,
                'ConfirmationCode' => $confirmationCode,
            ]);
        } catch (\Exception $e) {
            $this->cognito_error_service->confirmSignup($e);
            throw $e;
        }
    }

}

app\Services\CognitoService.php」を新規作成し、上記のように編集します。

CognitoErrorService新規作成

<?php

namespace App\Services;

class CognitoErrorService
{
    /* ステータスコード */
    private $STATUS_CODE_BAD_REQUEST;

    /* AWSエラーコード */
    private $AWS_ERROR_CODE_USER_NAME_EXISTS_EXCEPTION;

    /* AWSエラーメッセージ */
    private $AWS_ERROR_MESSAGE_USER_NAME_EXISTS_EXCEPTION;

    /**
     * コンストラクタ
     */
    public function __construct()
    {
        /* ステータスコード */
        $this->STATUS_CODE_BAD_REQUEST = 400;

        /* AWSエラーコード */
        $this->AWS_ERROR_CODE_USER_NAME_EXISTS_EXCEPTION = 'UsernameExistsException';

        /* AWSエラーメッセージ */
        $this->AWS_ERROR_MESSAGE_USER_NAME_EXISTS_EXCEPTION = 'ユーザが既に存在しています。';
    }

    /**
     * サインアップ時のエラーチェックを行う
     *
     * @param $e エラー
     */
    public function signUp(\Exception $e): void
    {
        // ユーザが既にユーザプール上に存在する場合
        if ($e->getStatusCode() === $this->STATUS_CODE_BAD_REQUEST &&
            $e->getAwsErrorCode() === $this->AWS_ERROR_CODE_USER_NAME_EXISTS_EXCEPTION) {
            abort($this->STATUS_CODE_BAD_REQUEST, $this->AWS_ERROR_MESSAGE_USER_NAME_EXISTS_EXCEPTION);
        }
    }

    /**
     * 認証コード確認時のエラーチェックを行う
     *
     * @param $e エラー
     */
    public function confirmSignup(\Exception $e): void
    {
    }

}

app\Services\CognitoErrorService.php」を新規作成し、上記のように編集します。

Cognitoのエラーはロジックを別に切り分けたいので、エラー用サービスを作成しました。

ハンドラ設定

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        if ($request->is('cognito/*')) {
            $status  = 500;
            $message = '想定外エラー';

            if ($this->isHttpException($exception)) {
                $status  = $exception->getStatusCode();
                $message = $exception->getMessage();
            }

            return response()->json([
                'status'  => $status,
                'message' => $message
            ], $status);
        }

        return parent::render($request, $exception);
    }
}

app\Exceptions\Handler.php」を上記のように編集します。

エラーをJson形式で返却したいのでカスタマイズしました。

実際にAPIを使ってみる

サインアップ処理を実行

Restlet Clientを使ってPOSTします。

Cognitoに新規ユーザが登録されていれば成功です。

***」の部分は正しい値を設定してください。

まとめ

今回は、LaravelでのCognito利用方法を解説しました。

非常に情報が少なかったので苦戦しました。。

ではまた!

  • おすすめ本はこちら!
いずみん

僕は↑の本でLaravelの勉強をしました!
非常に分かりやすいのでおすすめです!

  • 自由な生き方がしたいなら!

自由な生き方をするためには、稼ぐスキルを身に付けなければなりません。

当サイト「リバトレ」では稼ぐスキルに関する情報を日々発信しているので、興味のあるものから見て頂ければ嬉しいです。

稼ぐスキルを身に付けよう!!
SNSもフォローしてね!

この記事が気に入ったら
いいね または フォローしてね!

シェアするんやで!
  • URLをコピーしました!
  • URLをコピーしました!
目次