😎

【Laravel】Sanctomを使用してSPAでのログインを実装する

2021/05/22に公開

使用環境

  • Laravel Framework 8.32.1

会員登録の実装はこちら

https://zenn.dev/moria23/articles/3ec4e097e119dd243603

フロント側

フロントからは、メールアドレス、パスワードが渡される想定です。

作成までの流れ

  1. コントローラーの作成
  2. バリデーションの作成
  3. ルーティングの追加
  4. フロント実装

コントローラーの作成

会員登録と同様に、app/Http/Controller/Api/Auth配下にファイルを作成していきます。

app/Http/Controller/Api/Auth/LoginController.php
<?php

namespace App\Http\Controllers\Api\Auth;

use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\LoginRequest;

class LoginController extends Controller {

    public function login(LoginRequest $request) {

        $credentials = $request->validated();

        if (Auth::attempt($credentials)) {
            $user = Auth::user();

            $user->tokens()->delete();
            $token = $user->createToken("login:user{$user->id}")->plainTextToken;

            return response()->json([
                'result' => true,
                'token' => $token
            ], Response::HTTP_OK);
        }
        return response()->json([
            'result' => false,
        ], Response::HTTP_INTERNAL_SERVER_ERROR);

    }

バリデーションの作成

app/Http/Requests配下にLoginRequests.phpを作成します。

app/Http/Requests/RegisterRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
use Symfony\Component\HttpFoundation\Response;


class LoginRequest extends FormRequest {
    public function authorize() {
        return true;
    }

    public function rules() {
        return [
            'email'    => //必要なバリデーションを記載,
            'password' => //必要なバリデーション記載,
        ];
    }

    protected function failedValidation(Validator $validator) {
        $res = response()->json([
            'status' => Response::HTTP_BAD_REQUEST,
            'errors' => $validator->errors(),
        ], Response::HTTP_BAD_REQUEST);
        throw new HttpResponseException($res);
    }

}

ルーティングの追加

最後にルーティングを追記します。

routes/api.php
<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\Auth\RegisterController;
use App\Http\Controllers\Api\Auth\LoginController;//追記

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
//会員登録
Route::post('/register', [RegisterController::class, 'register']);
//ログイン
Route::post('/login', [LoginController::class, 'login']);//追記

/* 省略 */

バックエンド側の処理は以上で完成です。

Discussion