web-dev-qa-db-fra.com

Comment utiliser Laravel Passport with Password Grant Tokens?

Je viens de lire la documentation https://laravel.com/docs/5.6/passport et je doute que quelqu'un puisse m'aider:

Tout d'abord, dans un certain contexte, je souhaite utiliser Passport pour fournir l'authentification Oauth pour mon application mobile (application propriétaire).

  1. Lorsque j'utilise php artisan passport:client --password, Je récupère un ID client et un secret client. Cette valeur doit-elle être fixée sur mon application? par exemple, les stocker en dur ou sous forme de fichier "paramètres"? Si les valeurs ne doivent pas être stockées, comment cela devrait-il fonctionner?

  2. Pour enregistrer un utilisateur dans mon application, j'utilise: $user->createToken('The-App')->accessToken; J'obtiens que le accessToken sera celui utilisé pour envoyer toutes mes demandes en tant qu'en-tête (Autorisation => Bearer $ accessToken) mais qu'est-ce que "The -App "valeur pour?

  3. Pour me connecter, l'utilisateur utilise l'URL: http://example.com/oauth/token et envoie en tant que paramètres:

    {"username": "[email protected]", "password": "userpassword", "grant_type": "password", "client_id": 1, // L'ID client que j'ai obtenu de la commande (question 1) "client_secret": "Chut" // Le secret client que j'ai obtenu de la commande (question 1)}

  4. Lorsque je me connecte à l'utilisateur à l'aide du point de terminaison précédent, je récupère un refresh_token, j'ai lu que je pouvais actualiser le jeton via http://example.com/oauth/token/refresh mais j'essaie de demander le Actualiser J'ai eu l'erreur 419, j'ai supprimé l'URL oauth/token/refresh de la vérification csrf et maintenant je reviens "message": "Unauthenticated.", je fais la demande suivante:

    Content-Type: x-www-form-urlencoded grant_type: refresh_token refresh_token: the-refresh-token // Le jeton d'actualisation que j'ai obtenu de la commande (question 3) client_id: 1 // L'ID client que j'ai obtenu de la commande (question 1) client_secret: Shhh // Le secret client que j'ai obtenu de la commande (question 1) portée: ''

Dois-je utiliser ce point de terminaison? ou n'est pas nécessaire compte tenu de l'application que j'essaie de développer.

  1. Enfin, il y a beaucoup de points de terminaison que j'obtiens du passeport que je ne pense pas utiliser par exemple: oauth/clients*, oauth/personal-access-tokens* Est-il possible de les supprimer des points de terminaison publiés par passeport?

Merci beaucoup pour votre aide!

15
JohnnyAce

Si vous consommez votre propre API, vous n'avez pas besoin d'appeler http://example.com/oauth/token pour la connexion utilisateur, car vous devez alors stocker client_id et client_secret côté application. Mieux vaut créer une API pour la connexion et là, vous pouvez vérifier les informations d'identification et générer le jeton personnel.

public function login(Request $request)
{
        $credentials = $request->only('email', 'password');

        if (Auth::attempt($credentials)) {
            // Authentication passed...
             $user = Auth::user();
             $token = $user->createToken('Token Name')->accessToken;

            return response()->json($token);
        }
}

Enfin, il y a beaucoup de points de terminaison que je reçois du passeport que je ne pense pas utiliser par exemple: oauth/clients *, oauth/personal-access-tokens * est-il un moyen de les supprimer des points de terminaison publiés par passeport?

Vous devez supprimer Passport::routes(); d'AuthServiceProvider et ne mettre manuellement que les itinéraires de passeport requis. Je pense que vous n'avez besoin que de la route oauth/token.

à quoi sert exactement la valeur "The-App"?

si vous cochez oauth_access_tokens la table a un champ de nom. $user->createToken('Token Name')->accessToken; ici le "Token Name" stocké dans le champ du nom.

Comment utiliser Laravel Passport with Password Grant Tokens?

Pour générer un jeton d'octroi de mot de passe, vous devez stocker client_id Et client_secret À côté de l'application (non recommandé, vérifiez this ) et supposez que si vous devez réinitialiser le client_secret Puis l'ancienne application ne fonctionne plus, ce sont les problèmes. Pour générer un jeton d'octroi de mot de passe, vous devez appeler cette API comme vous le mentionnez à l'étape 3.

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => '[email protected]',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);

Générez un jeton à partir de refresh_token

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'refresh_token',
        'refresh_token' => 'the-refresh-token',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'scope' => '',
    ],
]);

return json_decode((string) $response->getBody(), true);

Vous pouvez regarder ceci https://laravel.com/docs/5.6/passport#implicit-grant-tokens aussi.

26
rkj

Répondre à la question 5

Enfin, il y a beaucoup de points d'extrémité que j'obtiens du passeport que je ne pense pas utiliser par exemple: oauth/clients*, oauth/personal-access-tokens* Est-il possible de les supprimer des points d'extrémité publiés par passeport?


Passport::routes($callback = null, array $options = []) prend une fonction $callback optionnelle et un argument $options optionnel.

La fonction de rappel prend un argument $router À partir duquel vous pouvez ensuite choisir les routes à installer comme indiqué ci-dessous dans votre AuthServiceProvider.php Qui permet une configuration plus granulaire:

Passport::routes(function ($router) {
    $router->forAccessTokens();
    $router->forPersonalAccessTokens();
    $router->forTransientTokens();
});

Passport::tokensExpireIn(Carbon::now()->addMinutes(10));

Passport::refreshTokensExpireIn(Carbon::now()->addDays(10));

De cette façon, nous créons uniquement les itinéraires de passeport dont nous avons besoin.

forAccessTokens(); nous permettent de créer des jetons d'accès.
forPersonalAccessTokens(); nous permettent de créer des jetons personnels bien que nous n'utilisions pas cela dans cet article. Enfin, forTransientTokens(); crée l'itinéraire pour rafraîchir les jetons.

Si vous exécutez php artisan route:list, Vous pouvez voir les nouveaux points de terminaison installés par Laravel Passport.

| POST | oauth/token         | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken
| POST | oauth/token/refresh | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh
0
Dan White