9
votes

Le passeport Laravel 6 renvoie 400 Mauvaise demande sur une mauvaise carte d'identité

J'utilise le mot de passe de concession de passeport Laravel 6 pour mon backend Vue.

Lorsque j'envoie les bonnes informations d'identification à oauth / token, cela fonctionne et renvoie le token, mais lorsque j'envoie un message erroné (email / mot de passe), il renvoie 400 au lieu de 401 avec ce message.

    {
    "error": "invalid_grant",
    "error_description": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.",
    "hint": "",
    "message": "The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client."
}

J'ai vérifié client_id et client_secret .

J'ai testé avec le nouveau passeport Laravel + installé sans une seule ligne de code, Laravel 5.8 renvoie 401 sans aucun problème mais Laravel 6 renvoie 400 mauvaises requêtes.

Avez-vous une idée?


6 commentaires

401 n'est pas autorisé, ce n'est pas une `` mauvaise information d'identification ''


Je sais, mais dans Laravel 5.8 lorsque je fournis un nom d'utilisateur / mot de passe incorrect, il renvoie 401 avec ce message: invalid_credentials (les informations d'identification de l'utilisateur étaient incorrectes) mais dans Laravel 6, il renvoie 400 avec le message invalid_grant @AlbertoSinigaglia


Avez-vous créé votre paire de clients avec l'indicateur --password dans artisan?


Selon le site Web de Laravel "Si vous avez déjà exécuté la commande passeport: install, vous n'avez pas besoin d'exécuter cette commande", mais oui, je les ai supprimés et j'ai créé un nouveau client avec le drapeau --password. @mdexp


Je rencontre le même problème, avez-vous trouvé une solution à cela?


@NinetyHH J'ai répondu à ce que j'ai trouvé.


4 Réponses :


9
votes

Enfin j'ai trouvé le problème, le problème est de retour à league / oauth2-server que celui utilisé par le passeport Laravel.

Ils ont changé la réponse de 401 à 400 dans la version 8.

Lien PR

J'ai changé mon code dans la section de connexion pour cela.

switch ($e->getCode()) {
    case 400:
    case 401:
        return response()->json('Your credentials are incorrect. Please try again', $e->getCode());
    break;
    default:
        return response()->json('Something went wrong on the server', $e->getCode());

}


5 commentaires

J'ai changé mes propres codes, "nous ne changeons généralement pas les fichiers du fournisseur ...", mais si vous voulez savoir où était le changement de fournisseur / league / oauth2-server / src / Grant / PasswordGrant.php ligne 107 throw OAuthServerException::invalidGrant(); changement pour throw OAuthServerException::invalidCredentials(); @azurecorn


Je suis confronté au même problème. Savez-vous s'il s'agit d'un problème connu ou d'une nouvelle façon de lever des exceptions? Votre solution ne représente en fait pas la vraie réponse puisque vous ne pourrez pas afficher "Hé! Données de connexion complètes!" ou "Hé! Vos données sont fausses!"


semble que c'est une nouvelle façon, et il devrait être 400 concernant ce document https://tools.ietf.org/html/rfc6749#section-5.2 . Si vous voulez séparer les informations d'identification erronées avec une erreur, vous pouvez créer un jeton manuellement en validant le nom d'utilisateur et le mot de passe, puis $user->createToken('tokenName')->accessToken accessToken @Luciano


C'est correct @Mojtaba Sayari, confirmé par les créateurs sur github.com/thephpleague/oauth2-server/issues/1093 Merci pour votre solution possible BTW


Je vous suggère d'utiliser abort au lieu de response: abort($response->status(), 'Your credentials are incorrect. Please try again')



0
votes

Vous pouvez ajouter le gestionnaire d'erreurs sur App \ Exceptions \ Handler

use League\OAuth2\Server\Exception\OAuthServerException;
class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
        if (get_class($exception) === OAuthServerException::class) {
            response()->json(['message' => $exception->getMessage()], 401);
        }
    }
}


1 commentaires

Rectifier use Laravel\Passport\Exceptions\OAuthServerException



0
votes

J'ai dû utiliser ce qui suit dans laravel 7.x pour convertir l'erreur de niveau 400 en 401 dans app/Exceptions/Handler.php

NB: vérifiez le type de OAuthServerException::class

/**
 * Render an exception into an HTTP response.
 *
 * @param \Illuminate\Http\Request $request
 * @param \Exception $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Throwable $exception)
{
    if (get_class($exception) === \Laravel\Passport\Exceptions\OAuthServerException::class) {
        return response(['message' => $exception->getMessage()], 401);
    }

    return parent::render($request, $exception);
}


0 commentaires

0
votes

Mettre à jour le mot de passe UserFactory (utilisez Hash :: make () pas bcrypt)


0 commentaires