Cómo evitar el cierre de sesión después del cambio de contraseña usando auth:sanctum como Middleware en Laravel
auth:sanctum — Permitir que los usuarios que han iniciado sesión cambien su contraseña es una característica común que implementan muchas aplicaciones web, y se hace de manera que el usuario siga conectado después de cambiar la contraseña. En Laravel Auth::login($ usuario); Hace el truco. Sin embargo, ese no es el caso cuando usa sanctum como si fuera middleware, el usuario se desconectará después de que se cambie la contraseña. Después de luchar durante 6 horas para implementar esta función usando sanctum, recurrí a Google al igual que muchos desarrolladores en busca de soluciones, ya sea de stackoverflow, laracasts u otros blogs que se hayan ocupado de este problema. Descubrí que es un problema con el que muchos desarrolladores todavía luchan.
Consulté esta publicación en Stackoverflow y esta publicación en Laracasts.
Cuando no pude obtener ninguna solución a través de mis búsquedas de Google, recurrí a la documentación de Laravel para obtener más claridad sobre la sesión.
auth:sanctum
En este tutorial, compartiré con ustedes cómo descubrí la solución, espero que pueda salvar a alguien….
Muestro cómo implementar cada uno, el resultado que obtendrá con cada uno y el resultado final se muestra en la implementación de auth:sanctum.
- $request->session()->has (‘password_hash_web’)
Lo usaríamos para verificar si la clave ‘password_hash_web’ existe en la sesión
- $user= auth (“web”) -> getUser ();
Esto obtiene los detalles del usuario de inicio de sesión
- $request->session()->flush ();
Esto vaciará la sesión. Sin embargo, deberá actualizar la página si implementa el cambio de contraseña con jQuery AJAX
- $request->session()->invalidate();
Esto revalida la sesión. Sin embargo, deberá actualizar la página si implementa el cambio de contraseña con jQuery AJAX
- Both $request->session()->flush (); y $request->session()->invalidate();
Funcionará si está enviando el formulario de la manera normal / regular en la que el navegador se actualiza después de hacer clic en el botón Enviar
- $request->sesión()->forget(‘password_hash_web’);
Esto eliminará la contraseña anterior. Esto hace que la solicitud AJAX funcione perfectamente con esto.
- Auth::guard(‘web’)->login ($ usuario);
Esto vuelve a iniciar sesión “lol” el usuario automáticamente.
Vamos a codificar
route/web.php
- Route::middleware(“auth: sanctum”)->group(function(){
Middleware de sanctum
- Route::put(“password/update”,[UserController::class, “passwordUpdate”] )->name(‘password.update’);
})
Actualización de la contraseña del usuario registrado
Nótese bien: Este es el formulario PasswordUpdateRequest. Si está familiarizado con FormRequest o simplemente puede validar los datos de entrada utilizando su método cómodo
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Password;
class PasswordUpdateRequest extends FormRequest
{
/**
* Determinar si el usuario está autorizado para realizar esta solicitud.
*
* @return bool
* /
public function authorize()
{
return true;
}
/**
* Obtenga las reglas de validación que se aplican a la solicitud.
*
* @return array
* /
public function rules()
{
return [
‘password’ => [‘bail’, ‘required’,
Password::min(8)
->mixedCase()
->numbers()
->letters()
->uncompromised()
],
];
}
}
Nótese bien: Este es un método dentro de su controlador
/ **
* [passwordUpdate description]
* @param PasswordUpdateRequest $ request [crear una solicitud de formulario para manejar la desinfección de los datos de entrada]
* @return [type] [description]
* /
public function passwordUpdate(PasswordUpdateRequest $request)
{
- if($request->validated()){
Comprobamos si la entrada está validada
- auth()->user()->update([‘password’ =>Hash::make($request->password)]);
Actualiza la contraseña. Hay diferentes formas de actualizar la contraseña
- if ($ request->session()->has(‘password_hash_web’)) {
Verifica si la clave password_hash_web existe en la sesión. Sin embargo, no es obligatorio.
- $user=auth(“web”)->getUser();
Obtener los datos del usuario
- $request->session()->forget(‘password_hash_web’);
Eliminar la contraseña anterior
- Auth::guard(‘web’)->login ($ usuario);
Vuelve a iniciar la sesión del usuario con sus nuevas credenciales actualizadas
echo “Password updated successfully”;
}
}
}
FRONT-END
<form action=”{{route(‘password.update’)}}” class=”passwordUpdate” method=”post”>
@csrf
@method(‘put’)
<P id=”result”></P>
<label class=”form-label passResult” for=”change-password”>Change Password</label>
<input class=”form-control” type=”password” name=”password”
id=”change-password” />
<button type=”submit” class=”btn btn-sm bg-at-blue-light px-3 py-1 mt-3 passbtn”>
Change Password
</button>
</form>
<script type=”text/javascript”>
$(document).ready(function(){
$(document).on(“submit”, “.passwordUpdate”, function(e){
e.preventDefault();
$(“.passbtn”).prop(“disabled”, true);
$.ajaxSetup ({
header:{
“X-CSRF-TOKEN”: $ (‘meta[name=”csrf-token “]’).attr(“content”)
}
});
$ .ajax ({
url: “{{route(‘password.update’)}}”,
método: “PUT”,
data: $(“.passwordUpdate”).serialize(),
success:function(result){
$ (“.passbtn”).prop(“disabled”, false);
$ (“#resultado”).html (result);
},
error:función(xhr){
var data = xhr.responseJSON;
if($.isEmptyObject(data.errors) == false) {
$.each(data.errors, function(key, result) {
$(“.passbtn”). Prop (“disable”, false);
$(“#result”). Html (result);
});
}
}
});
});
})
</script>