Laravel 5

Conseils pour un projet en cours (API accès par Password Grant Type)

Avatar de LPABelgium
LPABelgium

Bonjour à tous,

Je m'arrache le peu de cheveux qu'il me reste sur l'authentification des utilisateurs via une API et la persistance de cette authentification...

**En résumé : **

J'ai un front-end (et un CMS mais à ce stade on s'en fout). Dans celui-ci j'ai un formulaire classique de login : email / pass.

A la soumission du formulaire, une requête en POST est envoyée vers ma route : api/login (sur le même domaine que le front-end).

Cette route pointe vers un controller "AuthMemberController". Dans la méthode Login, je fais un appel via Guzzle en POST vers oauth/token avec les bons credentials (du client et du user). Je reçois bien un Token : https://share.getcloudapp.com/9ZuN1xgd

C'est à partir de là que je capte plus...

Via Postman :

Je fais une requête en GET vers api/me qui est censé me retourner les données de l'utilisateur connecté (Ressource). Sauf que je reçois un "Unauthenticated".

Via le front-end :

Le formulaire est en VueJS. La requête est envoyé vers api/login via Axios. En cas de succès (donc de récupération d'un token), je reload la page. Pour mon test, j'ai décalé le reload à 2 secondes, et là je vois via la debugbar que l'utilisateur est bien connecté au guard "web" : https://share.getcloudapp.com/yAuLNDdO

Au reload, il n'est plus connecté.

C'est probablement une conn$£¶, mais à force de tester tout ce que j'ai vu / lu j'ai probablement foutu le souk...Et j'ai beau lire la doc, je ne vois pas où j'ai merdé.

** Niveau config du projet :**

  • Serveur NGINX
  • Laravel 5.8
  • Passport 7.5
    • un tas d'autres packages (Spatie principalement)

Et pour les fichiers :

config/auth.php

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'members',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'members',
        ],
        'api' => [
            'driver' => 'passport',
            'provider' => 'members',
        ],
    ],
        'providers' => [
        'members' => [
            'driver' => 'eloquent',
            'model' => App\Member::class,
        ],
    ],

app/Providers/AuthServiceProvider.php

    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }

app/Http/Controllers/Api/AuthMemberController.php

    public function login(MemberAuthLogin $request)
    {
        $http = new GuzzleHttp\Client;
        try {
            $response = $http->post(route('passport.token'), [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' => config('api.member.client_id'),
                    'client_secret' => config('api.member.client_secret'),
                    'username' => $request->email,
                    'password' => $request->password,
                    'scope' => '*',
                ],
            ]);
        } catch (GuzzleHttp\Exception\ClientException $ex) {
            return response()->json(['error' => 'Unauthorized', 'code' => $ex->getCode(), 'msg' => $ex->getMessage()], 401);
        }
        if ($this->attemptLogin($request)) {
            $member = Auth::user();
        } else {
            return response()->json(['error' => 'Auth failed'], 401);
        }
        return response()
            ->json(json_decode((string)$response->getBody(), true), 200);
    }

app/Http/Controllers/Api/MemberAccountController.php

    public function me()
    {
        if(Auth::user()) {
            return new MemberResource(Auth::user());
        }else{
            return response()->json(['error' => 'Unauthorized'], 401);
        }
    }

J'ai aussi essayé d'ajouter des paramètres à Passport via AuthServiceProvider comme :

        Passport::cookie('MonApp');
        Passport::enableImplicitGrant();

Mais pas mieux...

Est-ce que j'oublie un Middleware quelque part ? Ou de déclarer quelque chose quelque part ? Est-ce que ça merde parce que les 3 entités de l'app (Api / Consumer App / CMS) fonctionnent dans le même projet Laravel ? Est-ce qu'au retour du login, je dois faire quelque chose en plus que simplement retourner le token ? Est-ce que je dois faire un appel vers une route "web" pour poursuivre l'authentification (je doute...) ?

A savoir que j'ai un 3ème guard pour les admins devant se connecter au CMS (et qui eux auront accès à l'API via un accès Client MachineToMachine).

Toute aide sera appréciable et appréciée à sa juste valeur :D

Posté il y a 5 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Je pense qu'il faut juste que tu renvoie ton token dans un header a chacune de tes requêtes (perso mes header de token sont genre Authorization : Bearer bfghsqs45427854) Moi, je store le token en session a l'authentification pour le renvoyer à chaque fois et le tour est joué.

Posté il y a 5 mois

Vous ne pouvez pas répondre à ce sujet.