Ruiz86
Eta
SEO
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
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);
}
}
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);
}
}
use Laravel\Passport\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens...
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.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:
Y al llamarla me da este error: Call to undefined method App\\Models\\User::createToken()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); } }
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?
App\Http\Middleware\Cors.php, puedes agregar las siguientes cabeceras:<?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');
}
}
App\Http\Kernel.php. Puedes hacerlo agregando tu middleware a la matriz $middleware:protected $middleware = [
// otros middlewares
\App\Http\Middleware\Cors::class,
];
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.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 archivoApp\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 archivoApp\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 decreateToken, al agregarHasApiTokensal 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ónlogin.
Fijate si te sirve, fue la respuesta de la IA del foro
Para resolver la configuración faltante en tu archivo
- 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?
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: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:protected $middleware = [
// Otros middlewares
\App\Http\Middleware\Cors::class,
];
\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.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!Por favor, si alguien puede ayudarme con una respuesta válida, se lo agradezco.
El archivo Kernel.php existe pero en versiones anteriores, a partir de la versión 11 (que es la que ocupas) fue removido y y todas las configuraciones necesarias se han movido al archivo bootstrap/app.php
- 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?
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?
Utilizamos cookies y tecnologías similares para los siguientes fines:
¿Aceptas las cookies y estas tecnologías?