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?
4 Réponses :
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.
ouais je pense que ça a quelque chose à voir avec les cookies, mais je suppose que laravel devrait s'en occuper
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.
Essayez d'utiliser return response () -> json (['success' => 1, 'redirect' => URL ('/')]); plutôt que echo code>.
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 a>)
@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.
Remplacez votre ligne
return response()->json(['success' => 1, 'redirect' => URL('/')]);
par
echo json_encode(['success'=>1 , 'redirect'=>URL('/')]);
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 middlewareweb. 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 httpAvez-vous vérifié la console réseau de votre navigateur? La demande AJAX est-elle envoyée correctement?