1
votes

I wrote an API in Laravel 5.8 for User Login and Register.

I use JWTAuth in Laravel 5.8. When I tested the Login on Postman, it generated an error, undefined variable: token. I tried to write the API for register, when I tested it, it worked perfectly. Based on what I saw online, I tried adding \Illuminate\View\Middleware\ShareErrorsFromSession::class, to the kernel but still the same error.

LoginController

    public function login(Request $request)
    {
        $credentials = $request->json()->all();

        try
        {
            if(! $token == JWTAuth::attempt($credentials))
            {
                return response()->json(['error' => 'invalid_credentials'], 400);
            }
        }
        catch(JWTException $e)
        {
            return response()->json(['error' => 'could_not_create_token'], 500);
        }
        return response()->json(compact('token'));

    }   

    public function register(Request $request)
    {
        $validator = Validator::make($request->json()->all() , [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:6',
            'username' => 'required|string|max:255',
        ]);

        if($validator->fails()){
            return response()->json($validator->errors()->toJson(), 400);
        }
        $user = User::create([
            'name' => $request->json()->get('name'),
            'email' => $request->json()->get('email'),
            'password' => Hash::make($request->json()->get('password')),
            'username' => $request->json()->get('username'),
        ]);

        $token = JWTAuth::fromUser($user);

        return response()->json(compact('user', 'token'), 201);
    }

api.php

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

Route::post('register', 'UserController@register');
Route::post('login', 'UserController@login');
Route::get('profile', 'UserController@getAuthenticatedUser');

I expected success, but it gave error:

ErrorException: Undefined variable: token in file C:\xampp\htdocs\laravelapi\app\Http\Controllers\UserController.php on line 52

This is my line 52:

if(! $token == JWTAuth::attempt($credentials))

2

2 Answers

1
votes

define $token before line 52

$token = null;
1
votes

You should use assignment operator and not equal ==:

$token = JWTAuth::attempt($credentials))

Also in the login function you should generate a token from user to return

 public function login(Request $request)
        {
            $credentials = $request->json()->all();

            try
            {
                if(! $token = JWTAuth::attempt($credentials))
                {
                    return response()->json(['error' => 'invalid_credentials'], 400);
                } else {
                    // Generate token from user 
                    $token = JWTAuth::attempt($credentials);
                    return response()->json(compact('token'));
                }
            }
            catch(JWTException $e)
            {
                return response()->json(['error' => 'could_not_create_token'], 500);
            }
        }