Vlad_Shilov
Vlad_Shilov

Reputation: 33

Call to a member function token() on null

I'm doing authorization using laravel:sanctum for the API. But, when calling the logout() method, I get the following error: Call to a member function tokens() on null. Please help me get rid of this error

AuthController

 public function auth(UserLoginRequest $request){

        $user = User::query()->where('login', $request->get('login'))->first();
        if (!$user || !Hash::check($request->get('password'), $user->password)) {
            return response()->json(['message'=>'Попытка входа не удалась'], 400);
        }

        $token = $user->createToken('api_token')->plainTextToken;
        $user->api_token = $token;
        $user->save();

        return response()->json(['message'=>$user->api_token], 200);
    }

    public function logout(Request $request) {
        $request->user()->tokens()->delete();

        return response()->json(['message' => 'Вы вышли из системы'], 200);
    }

api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::middleware('auth:sanctum')->get('user', function (UserLoginRequest $request) {
    return response()->json(['login' => $request->user()->login]);
});

Route::post('auth', [AuthController::class, 'auth']);
Route::post('authStore', [AuthController::class, 'store']);
Route::get('authLogout', [AuthController::class, 'logout'])->middleware('auth:sanctum');

Route::get('application/{id}', [ApplicationController::class, 'showById']);
Route::get('application', [ApplicationController::class, 'show']);
Route::post('applicationStore', [ApplicationController::class, 'store']);
Route::post('applicationDelete', [ApplicationController::class, 'delete']);

Route::post('userDelete/{user}', [UserController::class, 'delete']);
Route::post('userStore', [UserController::class, 'store']);

Route::post('review', [ReviewController::class, 'show']);
Route::post('reviewCreate', [ReviewController::class, 'create']);

Upvotes: 0

Views: 13181

Answers (4)

Nsamba Isaac
Nsamba Isaac

Reputation: 495

solved this by adding my logout Route inside :-

Route::group(['middleware' => ['auth:sanctum']], function () {
// logout route api code here
}

Upvotes: 5

Tony
Tony

Reputation: 41

Use auth('sanctum') instead auth() because of you used to sanctum auth

It should be:

auth('sanctum')->user()->tokens()->delete();

Upvotes: 4

Sadikur Rahaman
Sadikur Rahaman

Reputation: 148

The code should be like following

public function logout(Request $request) {
    if ($request->user()) { 
        $request->user()->tokens()->delete();
    }

    return response()->json(['message' => 'Вы вышли из системы'], 200);
}

Upvotes: 2

user15422497
user15422497

Reputation:

use currentAccessToken() instead of tokens().

Upvotes: 0

Related Questions