テックブログ

  1. Laravel
  2. 466 view

Laravelで爆速API開発シリーズ「ユーザ新規登録編」

Laravelで爆速API開発シリーズ第二弾は「ユーザ新規登録」です!

メールによる新規会員登録フローはかなり実装機会の多い機能なので本記事で徹底解説します。

この記事は、Laravelで爆速API開発シリーズ「ユーザログイン編」の続きなので未読の方はぜひチェックしてください!

ゴール

今回作るものは

→ユーザがメールアドレスを入力するとそのメールアドレスに確認メールが送信される
→ユーザが確認メール中のリンクを踏むととアカウントが有効化される

というアプリを想定したAPIです。フローが複雑なので混乱しないように頭を整理しながら進めて行きましょう!

使うもの

POSTMAN

有効化メールを送るAPIを作る

それでは、早速作って行きましょう!まずは仕様の確認です。
[POST]/registerにemailをリクエストした時、Laravelアプリケーション内で有効化コードを生成し保存します。また、有効化コードを含んだurlをメールで送ります。

今回はフロントエンド側は作りませんが、生成するurlは{フロントエンドのホストURL}/verify/:codeのようにしてフロントエンド側から受け取ったcodeをあとで作成するアカウント有効化のAPIに投げる想定です。

コントローラを作成する

まずは以下のコマンドを実行してRegisterControllerを作成しましょう。

php artisan make:controller RegisterController

生成されたコントローラにとりあえず以下のような仮のメソッドを定義しておきましょう。(リクエストの中のemailをそのまま返すだけです。)

public function register(Request $request) {
  return $request->email;
}

ルーティングを作成する

routes/api.phpを開いての定義を記述します。

Route::post('register', '[email protected]');

一度確認のためPOSTMANで定義したAPIを叩いてみましょう。
こうなっていれば成功です!

モデルを作成する

有効化コードを保存する場所は色々な選択肢があるのですが、今回は全く新しいテーブルを作ってリクエストがきたらemailと生成された有効化コードを保存することにしましょう。

ターミナルを開いて以下のコマンドを実行しましょう。

php artisan make:model Activation -m

App/Activation.phpとともに空のマイグレーションファイルが作成されました。

マイグレーションを記述する

Activationテーブルにはメールアドレスと有効化コードを保存します。

database/migration/
XXXX_XX_XX_create_activations_table
を開いて以下のように記述しましょう。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateActivationsTable extends Migration {
  /**
      * Run the migrations.
      *
      * @return void
     */

  public function up() {
    Schema::create('activations', function (Blueprint $table) {
      $table->increments('id');
      $table->string('email');
      $table->string('code');
      $table->timestamps();
    });
  }

  /**
  * Reverse the migrations.
  *
  * @return void
  */
  public function down()
  {
    Schema::dropIfExists('activations');
  }
}

記述できたら

php artisan migrate

を実行してテーブルを作成しましょう。

有効化コードを生成する

今回は有効化コードにUUIDを使います。

UUIDとは理論上重複しないランダムな文字列を生成してくれるやつです。
ramsey/uuidをインストールしましょう。

composer require ramsey/uuid

インストールできたら先程作成したRegisterControllerに戻り、以下のような記述をします。

app/Http/Controllers/RegisterController

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

// UUIDライブラリ
use Ramsey\Uuid\Uuid;

// Activationモデル
use App\Activation;

class RegisterController extends Controller {
  public function register(Request $request) {
    $activation = new Activation;
    $activation->email = $request->email;
    $activation->code = Uuid::uuid4();
    $activation->save();
  }
}

先ほどと同じようにPOSTMANでリクエストを投げてみると以下のようなデータが作成されるはずです。

有効化メールを送る

それでは、生成された有効化コードを含んだメールを送りましょう。

Laravelはメール送信周りが非常に強力なのでさくっと終わります!

まずはmake:mailコマンドを使用して、mailableクラスを生成しましょう。

php artisan make:mail ActivationCreated --markdown=emails.activations.created

このコマンドを実行するとapp/Mailディレクトリに新しくActivationCreatedクラスが生成されます。

このMailableクラスを以下のように書き上げましょう。

<?php

namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue; // Activationモデル
use App\Activation;

class ActivationCreated extends Mailable {
  use Queueable, SerializesModels;
  protected $activation;
  /**
   * Create a new message instance.
      *
      * @return void
   */

  public function __construct(Activation $activation) {
    $this->activation = $activation;
  }

  /**
  * Build the message.
  *
  * @return $this
  */
  public function build()
  {
    $frontendURL = "http://example-front.com";
    return $this->subject('アカウント有効化メール')
    ->markdown('emails.activations.created')
    ->with([
      'link' => $frontendURL."/verify/{$this->activation->code}"
    ]);
  }
}

また生成されたメールテンプレートは例えば以下のようになります。

resources/views/
emails/activations/
created.blade.php

@component('mail::message')

# 新規登録していただきありがとうございます!
下記のリンクをクリックしてアカウントの有効化を行ってください。

@component('mail::button', ['url' => $link])
アカウントの有効化
@endcomponent

Thanks,
{{ config('app.name') }}
@endcomponent

Laravelのマークダウンメールは最初見慣れないかもしれませんが、慣れるとかなり素早くメールを作成できるのでおすすめです。

メール関連を書き上げたら先ほどのRegisterControllerに戻りましょう。

以下がメール送信のロジックを含んだRegisterControllerです。

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;

use Ramsey\Uuid\Uuid; // UUIDライブラリ

// Activationモデル
use App\Activation;

// Mailファサード
use Illuminate\Support\Facades\Mail;

use App\Mail\ActivationCreated;

class RegisterController extends Controller {
  public function register(Request $request) {
    $activation = new Activation;
    $activation->email = $request->email;
    $activation->code = Uuid::uuid4();
    $activation->save();
    Mail::to($activation->email)->send(new ActivationCreated($activation));
  }
}

それでは、POSTMANをと行きたいところですが、メール送信の設定をしましょう。
.envファイルを開き、以下の項目を埋めましょう。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=XXXXXX
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME=テスト

設定を終えたらPOSTMANで叩いてみてください!

以下のようなメールが届けば成功です!

お疲れ様です。これにて有効化メールを送信するAPIを作る部分は終わりです。
次はアカウントを有効化するAPIを作ります。

アカウントを有効化するAPIを作る

目標は[POST] /activateに有効化コードを投げたらuserが作成されてJWTがかえるようにすることです。JWTについてはLaravelで爆速API開発シリーズ「ユーザログイン編」を参考にしてください。

コントローラロジックの作成

RegisterControllerを開いて以下を記述します。

use App\User;

use JWTAuth;

......

......

public function activate(Request $request) {
  $code = $request->code;
  if(!$this->checkCode($code)){
    return response()->json(
     ['errors' => ['key' => ['認証キーが無効です。']]]
   , 401);
  }
  $activation = Activation::where('code',$code)
  ->orderBy('created_at','desc')
  ->firstorFail();
  $user = User::create([
    'name' => $request->name,
    'email' => $activation->email,
    'password' => bcrypt($request->password),
  ]);
  $token = JWTAuth::fromUser($user);
  return response()->json(compact('token'));
}

/**
* コードが有効かチェックする
*/

private function checkCode($code){
  $activation = Activation::where('code',$code)
  ->first();
  if(!$activation){
    return false;
  }
  $email = $activation->email;
  $latest = Activation::where('email',$email)
  ->orderBy('created_at', 'desc')
  ->first();
  $user = User::where('email',$email)->first();
  return $code === $latest->code && !$user;
}

そしてroutes/api.phpに以下を記述します。

Route::post('activate', '[email protected]');

以下のようにPOSTMANで確認できれば成功です!

本当は有効化コードの期限を設定したり、いらなくなったコードを削除するロジックなどが必要なのですが、本記事では割愛させていただきます。長くなってしましましたがここら辺は一度覚えれば少しの応用でカバーできるのでしっかりマスターしてしまいましょう!

Laravelで爆速API開発シリーズはまだまだ続きますのでお楽しみに〜

The following two tabs change content below.

riri

半年おきくらいにバックエンドとフロントエンドを行ったり来たり。 25歳。 将棋好き。

Laravelの最近記事

  1. Laravel HorizonでQueue/Jobを眺める

  2. LaravelでRedisとSupervisorを導入してQueue/Jobを扱う【doc…

  3. Laravelの環境(Nginx+MySQL+PHP)をdocker-composeでイチ…

  4. Laravel5.6で掲示板システムを作るチュートリアル

  5. Laravel+Nginx+phpMyAdminをlaradockで環境構築

関連記事

コメント

  1. コメント失礼いたします。
    現在api認証システムを構築しています。
    なべと申します。
    そしてこちらのサイトを参考にさせていただいているのですが、
    一番最後postmanにどのようなデータをどのように送ったらい
    いのか教えていただけないでしょうか。
    宜しくお願いいたします。

  1. この記事へのトラックバックはありません。