現役フリーランスエンジニアが運営するテックメディア。日々の業務で得た知識を発信していきます!

  1. バックエンド
  2. 4960 view

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

最終更新日:2019/02/15

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', 'RegisterController@register');

一度確認のため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', 'RegisterController@activate');

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

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

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

Laravelのおすすめ本紹介

Laravelで爆速API開発シリーズ以外にも、Laravelの理解を深めたい方にはこちらの本がおすすめです!

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応

Laravelの本は数多く出版されていますが、この本が断然わかりやすいと思います!

Laravelマスターを目指すならぜひ一度ご覧になってみるといいと思います。

The following two tabs change content below.
WINDII

WINDII

WINDII(ウィンディ)は、フリーランスエンジニアが運営するテックメディアです。 日々の業務で得た知見を、皆さんに役立つコンテンツにして発信していくので応援よろしくお願いします! また、Slackで無料コミュニティも運営しています。たくさんのエンジニアが参加していて、プログラミングの相談や雑談などをしている楽しいコミュニティなので、興味ある方はぜひお気軽にご参加ください。 Slackコミュニティはこちらから

バックエンドの最近記事

  1. 人気急上昇中のLaravelをはじめよう!【徹底解説】

  2. Laravelの認可を理解して実装してみよう!

  3. Laravelのシーティング(Seeding)機能をマスターしよう!

  4. Laravelのメール確認機能を設定してみよう!

  5. Laravelの認証機能を設定してみよう!

関連記事

コメント

  1. アバター

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

  2. アバター

    非常にわかりやすいです!

    • riri
      • riri
      • 2018年 12月 16日

      ありがとうございます!
      これからもガンガン更新していくので、みてください〜?

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

PAGE TOP