1
votes

Laravel: problème lors de la connexion à l'objet utilisateur via une requête AJAX

J'essaye de changer ma connexion en OTP.

J'enverrai à l'utilisateur un jeton par SMS. L'utilisateur entre le token et soumet le pour vérification dans le backend via AJAX.

C'est la fonction qui vérifie le code:

return redirect(URL('/'));

Voici mon Appel AJAX, veuillez ignorer les erreurs de syntaxe:

function vrify(){
    let form = {
        token : $('#token').val() , 
        //csrf token 
    };

    $.post( '{{route("verify")}}' ,  form , function(data){
        data = $.parseJson(data);
        if(data.success == 1 )
        {
            document.location = data.redirect ; 
        }
    })
}

Même si la vérification est réussie, l'utilisateur n'est pas connecté après la redirection.

Si j'envoie des données comme POST de forme normale, et changez la dernière ligne de la fonction de vérification en:

function verify_token(Request $request){
    $token = LoginToken::where('token' , $request->input('token') )->first();
    if(!$token)
        jerror("cant find the token !") ;

    $user = User::findOrFail($token->user_id);
    Auth::loginUsingId($token->user_id);

    echo json_encode(['success'=>1 , 'redirect'=>URL('/')]);
}

Cela fonctionne très bien!

Qu'est-ce que je fais de mal?


8 commentaires

Y a-t-il une valeur dans $ user?


L'actualisation de la page enregistrera-t-elle l'utilisateur? La redirection redirige essentiellement uniquement la demande AJAX et non la page du navigateur sur laquelle vous vous trouvez. Donc, après une vérification réussie dans votre JavaScript, effectuez la redirection.


@Ranjeet oui, je l'ai vérifié ... aussi formulaire qui fonctionne trouver utilise ce code


@Michael lors de son appel ajax, je retournerai l'adresse de redirection dans la réponse du backend et js redirigera l'utilisateur vers cette adresse après l'appel ajax, ce qui ne fonctionne pas .... lorsque j'utilise un formulaire html normal, envoi de l'utilisateur navigateur vers la fonction de vérification et redirection de l'utilisateur après vérification, cela fonctionne ... j'ai ajouté du code js à ma question pour clarifier


Votre route de vérification et l'URL vers laquelle vous redirigez-vous sont-ils tous les deux dans le groupe middleware Web?


@mdexp et j'ai un clientMiddleware qui lit certaines données générales de la base de données et les injecte pour les visualiser ... ils sont tous les deux dans ce middleware


Pouvez-vous publier vos itinéraires (et spécifier s'ils sont définis dans web.php ou api.php ou tout autre fichier) ou la sortie pertinente de php artisan route: list ? Le fait est que les sessions sont démarrées avec le middleware \ Illuminate \ Session \ Middleware \ StartSession :: class . Cela se fait par défaut dans le groupe middleware web . Si votre itinéraire est en dehors de ce groupe et que ce middleware particulier n'est pas appliqué, vous ne pouvez pas interagir avec les sessions via différentes requêtes http


Avez-vous vérifié la console réseau de votre navigateur? La demande AJAX est-elle envoyée correctement?


4 Réponses :


0
votes

Je pense que vous devriez définir un cookie. car après la connexion, laravel a défini le cookie à partir des en-têtes et vérifiez l'authentification à partir de celui-ci.


1 commentaires

ouais je pense que ça a quelque chose à voir avec les cookies, mais je suppose que laravel devrait s'en occuper



0
votes

Si l'utilisateur n'est pas connecté après la redirection, vous ne stockez essentiellement pas ses informations d'identification, n'ayant donc pas de session de connexion. Comme @omidkhaleghi l'a dit, vous pouvez définir un cookie httponly contenant le jeton, qui sera utilisé dans votre demande car l'authentification / middleware joue également son rôle ici / Quant à vérifier si un utilisateur est connecté, vous pouvez simplement vérifier si le cookie existe et si le jeton est valide.

Vérifiez également ceci . Je pense que cela peut vous aider.


0 commentaires

1
votes

Essayez d'utiliser return response () -> json (['success' => 1, 'redirect' => URL ('/')]); plutôt que echo .

De plus, essayez Auth :: login ($ token) au lieu de Auth :: loginUsingId ($ token-> user_id) .

Veuillez également noter que par défaut, Auth :: loginUsingId () prend la clé primaire. ( https://laravel.com/docs/5.0/authentication#authenticating-users)


1 commentaires

@hretic De rien. C'était parce que votre fonction ne revenait jamais plus tôt. Mettre à jour la réponse pour la rendre plus claire pour référence future.



1
votes

Remplacez votre ligne

return response()->json(['success' => 1, 'redirect' => URL('/')]);

par

 echo json_encode(['success'=>1 , 'redirect'=>URL('/')]);


0 commentaires