LoginSignup
13

More than 3 years have passed since last update.

Laravelの認証でwebとapiの両方を使う

Posted at

LaravelでのAPIの認証は、こちをご参照ください。
LaravelでのJWT認証

Laravelの認証は、config/auth.phpにのguardにて設定しますが、defaultをapiに設定するとwebでの認証ができなくなってしまいます。

config/auth.php
    'defaults' => [
        'guard' => 'api', // ← ここです。
        'passwords' => 'users',
    ],

一つのLaravelプロジェクトで、webとapiの両方を実装したいときの対応になります。

Laravelではauth()や、Auth::login()などで使用する認証は、guardのデフォルトの方となるようです。
デフォルト以外のものを使うときは、Auth::guard('[guard名]')->login()とguardを指定して使用します。
そうすることで、webとapiの両立を実現します。

defaultの設定

guardのdefaultはwebにしておきます。
make:authのコントローラーもそのまま使えるので便利です。

config/auth.php
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

API側の認証のコントローラにてguardを指定する

実装例のAuthControllerは、LaravelでのJWT認証で使用したものです。
Quick startで紹介されているものから少しだけ修正しています。
それに対して、上記のようにauth()Auth::guard('api')に変更します。

app/Http/Controllers/Api/AuthController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
//        $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = Auth::guard('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        Auth::guard('api')->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        try {
            return $this->respondWithToken(Auth::guard('api')->refresh());
        } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
        ]);
    }
}

認証後のコントローラー

auth()->user()は、変更しなくてもユーザー情報の取得はできているようなので、この認証を使って作成するAPI側は特にguardの指定はしなくてもよさそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13