Laravel auth::sanctum middleware not working for API routes

537 Views Asked by At

I am getting the error InvalidArgumentException: Auth guard [auth] is not defined. with the below given code.I understood this error is because I have added auth in the guards array of config/sanctum.php . But I am not understanding what else is to be given there instead of auth.

My actual requirement is to get the logged in user's id in my API by using the sanctum middleware for authentication. It currently returns null for the line of code in controller.

Does anyone know what all fixes shall i make in this context? Any help is appreciated.

Controller

 dd(auth()->user());

routes/api.php

Route::post('login', [UserController::class, 'Login'])->name('login');

Route::group(['prefix' => 'user'],function () {
   Route::group(['middleware' => ['user','auth:sanctum']], function () {
     Route::post('send-msg', [ChatController::class, 'store'])->name('send-msg');
     });
   }
);

Kernal.php

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
        'api' => [
             \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
            'throttle:api',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'user' => \App\Http\Middleware\AuthUser::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    ];

config/sanctum.php

'guard' => ['web','auth'],

config/auth.php

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'sanctum',
            'provider' => 'users',
        ],
    ],

'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],
    ],

Http/Middleware/Authenticate.php

namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }
}
1

There are 1 best solutions below

8
New To Code On

auth() is belong to laravel web authentication which maintains state using session storage and cookies, not sanctum it self. what authentication method your app is using?

you should just use laravel web authentication if you are developing laravel web.

namespace App\Http\Controllers;
use Illuminate\Http\Request;
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\Models\User;
use Validator;
class AuthController extends Controller
{
public function register(Request $request)
  {
      $request->validate([
          'name' => 'required|string',
          'email' => 'required|string|email|unique:users',
          'password' => 'required|string|',
          'c_password'=>'required|same:password',
      ]);

      $user = new User([
          'name' => $request->name,
          'email' => $request->email,
          'password' => bcrypt($request->password)
      ]);

      if($user->save()){
          return response()->json([
              'message' => 'Successfully created user!'
          ], 201);
      }else{
          return response()->json(['error'=>'Provide proper details']);
      }
    }
  }
public function login(Request $request)
{
  $request->validate([
    'email' => 'required|string|email',
    'password' => 'required|string',
    'remember_me' => 'boolean'
  ]);

  $credentials = request(['email', 'password']);
  if(!Auth::attempt($credentials))
  {
    return response()->json([
    'message' => 'Unauthorized'
    ], 401);
  }

  $user = $request->user();
  $tokenResult = $user->createToken('Personal Access Token');
  $token = $tokenResult->plainTextToken;


  return response()->json([
    'access_token' => $token,
    'token_type' => 'Bearer',
  ]);
}

public function user(Request $request)
{
  $user = Auth::user();
  return response()->json($user);
}

}

Your User Model should you HasApi Trait

use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
  use HasApiTokens;
}

Then to guard your route

use App\Http\Controllers\AuthController;
Route::group([
  'prefix' => 'auth'
], function () {
  Route::post('login', [AuthController::class, 'login']);
  Route::post('register', [AuthController::class, 'register']);

  Route::group([
    'middleware' => 'auth:sanctum'
  ], function () {
    Route::get('logout', [AuthController::class, 'logout']);
    Route::get('user', [AuthController::class, 'user']);
  });
});