skip to Main Content

I’m having an issue when trying to register a new user in my Laravel application that uses Passport for API authentication. Here’s the scenario and the error I’m facing:

Scenario:
I’m developing a RESTful API with Laravel and using Passport for user authentication. I’m trying to create an endpoint to register new users through a POST request to /api/register.

Error:
When I attempt to register a new user by sending the appropriate JSON data via Postman, I receive the following error:

json
Copy code
{
"name":"paco",
"email": "[email protected]",
"password": "password123"
}
{
"error": "Unauthorized2"
}
Relevant Code:
I’ve configured my PassportAuthMiddleware middleware to protect the API routes, but I’m puzzled as to why I’m receiving this error even on the registration route that shouldn’t be protected.

Questions:

What could be causing this "Unauthorized2" error when trying to register a new user?
What steps should I take to resolve this issue and allow registration requests to pass without errors?

Postman
Middleware

Im trying to use withoutMiddleware, but still doesnt work
api.php (Routes)

AuthController.php :

<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
use AppModelsUser;
use IlluminateSupportFacadesValidator;
use LaravelSanctumHasApiTokens;
use AppEnumsRoles;

class AuthController extends Controller
{
    /**
     * Registro de un nuevo usuario.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpJsonResponse
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8',
        ]);

        if ($validator->fails()) {
            return response()->json(['error' => $validator->errors()], 400);
        }

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
            'role' => Roles::USER, // Asignamos el rol de usuario por defecto al registrar
        ]);

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

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

    /**
     * Login de usuario existente.
     *
     * @param  IlluminateHttpRequest  $request
     * @return IlluminateHttpJsonResponse
     */
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');
        
        if (Auth::attempt($credentials)) {
            $user = $request->user();
            $token = $user->createToken('auth_token')->plainTextToken;

            // Verificar el rol del usuario y redirigir según el rol
            if ($user->role === Roles::ADMIN) {
                return response()->json(['token' => $token, 'role' => Roles::ADMIN], 200);
            } elseif ($user->role === Roles::USER) {
                return response()->json(['token' => $token, 'role' => Roles::USER], 200);
            }

            // En caso de que el rol no esté definido o no coincida con los roles permitidos
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return response()->json(['error' => 'Unauthorized'], 401);
    }
}

I can’t even access the register or login routes, which shouldn’t be protected by any middleware.

I have even opened a GitHub repository so that the error can be seen if necessary. I have been trying to solve it for several days and I am not able to. I have discussed the problem with my teacher, and we haven’t been able to solve it together… I don’t know what else to do; it’s my final project for the boot camp :’) I would love to be able to solve it and move on to testing.
https://github.com/LemonRH/TestSprint5

I have tried many different things, but none of them work. I have tried to do some var dumps, but it doesn’t even get to that point. I’m starting to think it must be a stupid error that I’m not able to see. I have tried to review most of my project-related files with ChatGPT, and I can’t figure out what the problem is.

2

Answers


  1. Change use LaravelSanctumHasApiTokens; to use LaravelPassportHasApiTokens; in User.php

    then comment this AppHttpMiddlewarePassportAuthMiddleware::class in appHttpKernel.php

    Login or Signup to reply.
  2. I have Checked your GitHub repository and found some passport configuration issues in your code, then I update your code in 3 files like below snippets:

    First Change in api.php

        use AppHttpControllersAuthController;
        use AppHttpMiddlewarePassportAuthMiddleware;
        
        // Rutas de autenticación
        Route::post('/login', [AuthController::class, 'login'])->withoutMiddleware(PassportAuthMiddleware::class);
        Route::post('/register', [AuthController::class, 'register'])->withoutMiddleware(PassportAuthMiddleware::class);
    

    Second Change in AppHttpControllersAuthController's register function :

        public function register(Request $request)
        {
            $validator = Validator::make($request->all(), [
                'name' => 'required|string|max:255',
                'email' => 'required|string|email|max:255|unique:users',
                'password' => 'required|string|min:8',
            ]);
    
            if ($validator->fails()) {
                return response()->json(['error' => $validator->errors()], 400);
            }
    
            $user = User::create([
                'name' => $request->name,
                'email' => $request->email,
                'password' => bcrypt($request->password),
                'role' => Roles::USER, // Asignamos el rol de usuario por defecto al registrar
            ]);
            $credentials = $request->only(['email', 'password']);
            if(Auth::attempt($credentials)) {
                $token = $user->createToken('Token Name')->accessToken;
            }
    
            return response()->json(['token' => $token], 201);
        }
    

    And last AppModelsUser :

    Remove

    use LaravelSanctumHasApiTokens; // Importa el trait HasApiTokens
    

    and Add

    use LaravelPassportHasApiTokens;
    

    This is the trait for Laravel passport which create access token.

    After these changes, your registration and generation accessToken completely working fine.

    Note: if you will face Personal access client not found error while creating accessToken run this command to fix php artisan passport:install

    For more details you can check document : https://laravel.com/docs/10.x/passport

    Thank you!

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search