Problema Error de Cors al agregar HasApiTokens en Laravel

Ruiz86 Seguir

Zeta
SEO
Verificación en dos pasos activada
¡Ha verificado su Paypal!
Desde
18 Dic 2012
Mensajes
1.506
Edad
38
Buenas compañeros, ojala me puedan ayudar, me pasa algo raro en Laravel (me estoy iniciando por lo que seguro que algo se me pasa).

Tengo un back en Laravel 11 (api rest) y un front con React. Antes de exponer el error en concreto, os dejo una llamada que si me funciona.

Función en controller en Laravel para cambiar la contraseña:
PHP:
public function changePassword(Request $request)
    {
        // Valido los datos de entrada
        $validator = Validator::make($request->all(), [
            'token' => 'required|string',
            'password' => 'required|string',
        ]);
        // Existe un email con solicitud de reestablecimiento
        $requested = PasswordResetToken::where('token', $request->token)->first();
        if($requested){
            $user = User::where('email', $requested->email)->first();
            // Confirmo que el email existe y cambio la contraseña
            if ($user) {
                $user->password = Hash::make($request->password);
                $user->save();
                return response()->json(['success' => 'Solicitud correcta'], 200);
            }
            else{
                return response()->json(['error' => 'User not found'], 401);
            }
        }else{
            return response()->json(['error' => 'Error token requested'], 401);
        }
    }

Ahora viene el problema, tengo la siguiente funcion "login" dentro del mismo controlador:
PHP:
public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $token = auth()->user()->createToken('Token')->accessToken;
            return response()->json(['token' => $token], 200);
        } else {
            return response()->json(['error' => 'Credenciales incorrectas'], 401);
        }
    }
Y al llamarla me da este error: Call to undefined method App\\Models\\User::createToken()

Entonces me he ido al modelo y he agregado "HasApiTokens" tal y como he googleado...:
Insertar CODE, HTML o PHP:
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens...

Y al hacer eso, la primera llamada "changePassword" me da error de Cors: "has been blocked by CORS policy: No 'Access-Control-Allow-Origin'".
Y la segunda llamada "login" ya no me da el error de createToken pero también me da error de Cors: "has been blocked by CORS policy: No 'Access-Control-Allow-Origin'".

¿Porque al agregar HasApiTokens al modelo User, me aparece error de Cors? ¿Qué hago mal o que me falta controlar?
 

Cicklow

Admin
Épsilon
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Suscripción a IA
Desde
30 May 2011
Mensajes
970
Buenas compañeros, ojala me puedan ayudar, me pasa algo raro en Laravel (me estoy iniciando por lo que seguro que algo se me pasa).

Tengo un back en Laravel 11 (api rest) y un front con React. Antes de exponer el error en concreto, os dejo una llamada que si me funciona.

Función en controller en Laravel para cambiar la contraseña:
PHP:
public function changePassword(Request $request)
    {
        // Valido los datos de entrada
        $validator = Validator::make($request->all(), [
            'token' => 'required|string',
            'password' => 'required|string',
        ]);
        // Existe un email con solicitud de reestablecimiento
        $requested = PasswordResetToken::where('token', $request->token)->first();
        if($requested){
            $user = User::where('email', $requested->email)->first();
            // Confirmo que el email existe y cambio la contraseña
            if ($user) {
                $user->password = Hash::make($request->password);
                $user->save();
                return response()->json(['success' => 'Solicitud correcta'], 200);
            }
            else{
                return response()->json(['error' => 'User not found'], 401);
            }
        }else{
            return response()->json(['error' => 'Error token requested'], 401);
        }
    }

Ahora viene el problema, tengo la siguiente funcion "login" dentro del mismo controlador:
PHP:
public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            $token = auth()->user()->createToken('Token')->accessToken;
            return response()->json(['token' => $token], 200);
        } else {
            return response()->json(['error' => 'Credenciales incorrectas'], 401);
        }
    }
Y al llamarla me da este error: Call to undefined method App\\Models\\User::createToken()

Entonces me he ido al modelo y he agregado "HasApiTokens" tal y como he googleado...:
Insertar CODE, HTML o PHP:
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens...

Y al hacer eso, la primera llamada "changePassword" me da error de Cors: "has been blocked by CORS policy: No 'Access-Control-Allow-Origin'".
Y la segunda llamada "login" ya no me da el error de createToken pero también me da error de Cors: "has been blocked by CORS policy: No 'Access-Control-Allow-Origin'".

¿Porque al agregar HasApiTokens al modelo User, me aparece error de Cors? ¿Qué hago mal o que me falta controlar?
Hola, parece que estás experimentando un problema común relacionado con CORS (Cross-Origin Resource Sharing) al agregar la funcionalidad de tokens API en Laravel.

Para solucionar el error de CORS, necesitas configurar tu backend de Laravel para permitir las solicitudes desde tu frontend de React. Puedes hacerlo configurando las cabeceras CORS en tu aplicación Laravel. Aquí te dejo un ejemplo de cómo puedes hacerlo:

En tu archivo App\Http\Middleware\Cors.php, puedes agregar las siguientes cabeceras:

PHP:
<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    }
}

Después de definir tu middleware CORS, asegúrate de registrarlo en el archivo App\Http\Kernel.php. Puedes hacerlo agregando tu middleware a la matriz $middleware:

PHP:
protected $middleware = [
    // otros middlewares
    \App\Http\Middleware\Cors::class,
];

Una vez que hayas configurado esto, tu backend Laravel debería permitir las solicitudes desde tu frontend React y el error de CORS debería resolverse.

En cuanto al error de createToken, al agregar HasApiTokens al modelo User, has integrado la funcionalidad de tokens de API proporcionada por Laravel Passport. Por lo tanto, ahora deberías poder generar tokens de acceso para autenticar las solicitudes de API, como en tu función login.

Fijate si te sirve, fue la respuesta de la IA del foro
 

Ruiz86

Zeta
SEO
Verificación en dos pasos activada
¡Ha verificado su Paypal!
Desde
18 Dic 2012
Mensajes
1.506
Edad
38
Hola, parece que estás experimentando un problema común relacionado con CORS (Cross-Origin Resource Sharing) al agregar la funcionalidad de tokens API en Laravel.

Para solucionar el error de CORS, necesitas configurar tu backend de Laravel para permitir las solicitudes desde tu frontend de React. Puedes hacerlo configurando las cabeceras CORS en tu aplicación Laravel. Aquí te dejo un ejemplo de cómo puedes hacerlo:

En tu archivo App\Http\Middleware\Cors.php, puedes agregar las siguientes cabeceras:

PHP:
<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    public function handle($request, Closure $next)
    {
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    }
}

Después de definir tu middleware CORS, asegúrate de registrarlo en el archivo App\Http\Kernel.php. Puedes hacerlo agregando tu middleware a la matriz $middleware:

PHP:
protected $middleware = [
    // otros middlewares
    \App\Http\Middleware\Cors::class,
];

Una vez que hayas configurado esto, tu backend Laravel debería permitir las solicitudes desde tu frontend React y el error de CORS debería resolverse.

En cuanto al error de createToken, al agregar HasApiTokens al modelo User, has integrado la funcionalidad de tokens de API proporcionada por Laravel Passport. Por lo tanto, ahora deberías poder generar tokens de acceso para autenticar las solicitudes de API, como en tu función login.

Fijate si te sirve, fue la respuesta de la IA del foro

  • No tenía creada la carpeta ni el archivo: App\Http\Middleware\Cors.php, los he creado tal cual.
  • Tampoco el archivo kernel en App\Http\Kernel.php, en este punto no conozco la estructura de este archivo ni si tengo que hacer algo para que laravel lo tenga en cuenta.

¿Cómo resuelvo el segundo punto?
 

Cicklow

Admin
Épsilon
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
Suscripción a IA
Desde
30 May 2011
Mensajes
970
Podes usar directo el chatgpt en el post para esto... pero el user bot respondio:

  • No tenía creada la carpeta ni el archivo: App\Http\Middleware\Cors.php, los he creado tal cual.
  • Tampoco el archivo kernel en App\Http\Kernel.php, en este punto no conozco la estructura de este archivo ni si tengo que hacer algo para que laravel lo tenga en cuenta.

¿Cómo resuelvo el segundo punto?
Para resolver la configuración faltante en tu archivo App\Http\Kernel.php, deberás registrar el middleware que creaste en App\Http\Middleware\Cors en la matriz correspondiente en el archivo Kernel.php. Aquí te muestro cómo puedes hacerlo:

Dentro de App\Http\Kernel.php, encontrarás una serie de propiedades protegidas las cuales pueden contener diferentes tipos de middlewares. Uno de estos es el grupo de middlewares globales ($middleware), el cual se aplica a todas las solicitudes HTTP que ingresen a tu aplicación de Laravel. Para registrar tu middleware Cors en este grupo, simplemente agrégalo a la matriz $middleware de esta manera:

PHP:
protected $middleware = [
    // Otros middlewares
    \App\Http\Middleware\Cors::class,
];

Al agregar \App\Http\Middleware\Cors::class a la matriz $middleware, Laravel comenzará a aplicar tu middleware de CORS a todas las solicitudes entrantes. Esto debería permitir las solicitudes desde tu frontend de React y resolver el error de CORS que estás experimentando.

Una vez que hayas realizado este paso, guarda los cambios en tu archivo App\Http\Kernel.php y asegúrate de que la estructura sea similar a lo que se muestra arriba. Con esta configuración, Laravel debería manejar las solicitudes CORS correctamente y permitir la comunicación entre tu backend y frontend sin problemas. ¡Espero que esta solución te ayude a resolver el problema!
 

Ruiz86

Zeta
SEO
Verificación en dos pasos activada
¡Ha verificado su Paypal!
Desde
18 Dic 2012
Mensajes
1.506
Edad
38
Por favor, si alguien puede ayudarme con una respuesta válida, se lo agradezco.
 

webcoder

Beta
Verificación en dos pasos desactivada
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
9 Ago 2023
Mensajes
93
Por favor, si alguien puede ayudarme con una respuesta válida, se lo agradezco.

En que estado estas ahora? pudiste agregar el middleware en el kernel. Igual si estas complicado podes agregar el cors en el .htaccess del apache para no complicarte.
 

¡Regístrate y comienza a ganar!

Beneficios

  • Gana dinero por participar
  • Gana dinero por recomendarnos
  • Descubre ofertas de empleo diariamente
  • Negocios seguros
  • ¡Información premium y más!

Acceder

¿Ya tienes una cuenta? Accede aquí

Arriba