[PHP][Laravel] API Laravel Passport

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • jpduits
  • Registratie: Februari 2016
  • Niet online
Hallo, ik heb een REST-API gebouwd om content te leveren aan verschillende relaties. Deze webservice heb ik afgeschermd met de Oauth (password grant) dmv Laravel Passport. Een gebruiker kan nu een access-token opvragen met zijn username, password, clientId en clientSecret.
Met het access-token kan de gebruiker dan de content opvragen waar deze recht op heeft. (ik kan dus op de server zien welke gebruiker het request doet met Auth::user(); ).
Het werkt nu op deze manier.

Nu mijn vraag:

Is dit de juiste manier? Voor mijn gevoel is dit namelijk niet de manier zoals het zou moeten.
Is het de bedoeling dat elke gebruiker een unieke clientId en clientSecret krijgen?

Ik heb de 'Personal Access Token' uitgeprobeerd maar ik kan dan niet de gebruiker achterhalen op de server. Dit is essentieel ivm de te serveren content.

Iemand misschien een idee over wat nou de beste manier is? Of wellicht een alternatief? Zie regelmatig API's voorbij komen waar je alleen een token hebt en je volledig geautoriseerd bent. Dit kan ik met Laravels Passport niet voor elkaar krijgen.


Alvast bedankt! 8)7

Alle reacties


Acties:
  • 0 Henk 'm!

  • EagleTitan
  • Registratie: Januari 2004
  • Niet online
jpduits schreef op maandag 8 mei 2017 @ 10:50:
[...]

Is dit de juiste manier? Voor mijn gevoel is dit namelijk niet de manier zoals het zou moeten.
Is het de bedoeling dat elke gebruiker een unieke clientId en clientSecret krijgen?
De Client ID is uniek voor een client (hence the name), maar deze kan door meerdere gebruikers worden gebruikt. Het hangt dus vooral af van het scenario waarin je dit gebruikt. Als je het hebt over relaties: indien iedere relatie maar één username heeft, dan krijgt inderdaad iedere user een uniek Client ID. Maar als er meerdere gebruikers bij een relatie horen, kunnen deze gewoon gebruik maken van dezelfde Client ID. Het is in ieder geval verstandig om iedere relatie zijn eigen client te geven, zodat je deze ook weer kunt blokkeren zonder de andere relaties allemaal een nieuwe combinatie van Client ID en Client Secret te geven.
Ik heb de 'Personal Access Token' uitgeprobeerd maar ik kan dan niet de gebruiker achterhalen op de server. Dit is essentieel ivm de te serveren content.

Iemand misschien een idee over wat nou de beste manier is? Of wellicht een alternatief? Zie regelmatig API's voorbij komen waar je alleen een token hebt en je volledig geautoriseerd bent. Dit kan ik met Laravels Passport niet voor elkaar krijgen.
Een persoonlijk token is niets anders dan een token die je koppelt aan een account. Het token is dan de vervanging van een username/password combinatie. Je geeft deze eenmalig uit aan de gebruiker en deze kan het token vervolgens gebruiken om te authenticeren met jouw API.

Acties:
  • 0 Henk 'm!

  • jpduits
  • Registratie: Februari 2016
  • Niet online
Ok duidelijk.

Mijn 'probleem' is een beetje dat als je bijvoorbeeld een plugin maakt voor een CMS om met de webservice te communiceren je dan dus je gebruikersnaam, wachtwoord, clientId en clientSecret moet opslaan. Ik wil eigenlijk helemaal geen username en password opslaan. Is de password grant wel de juiste keuze?

Als ik bijvoorbeeld kijk naar deze code: https://github.com/printa.../blob/master/printapi.php dan zie ik dat zij alleen autoriseren met 'client credentials'. Het lijkt mij dat zij server-side toch kunnen zien welke user er een request gemaakt heeft.
Wanneer ik 'client credentials' gebruik icm Laravels Passport, krijg ik gewoon een accesstoken maar is de "gekoppelde" gebruiker altijd null.

Acties:
  • 0 Henk 'm!

  • kutagh
  • Registratie: Augustus 2009
  • Laatst online: 22:32
Dat klopt, de gebruiker in de Auth::guard() is onbekend, omdat er niet een access token voor een gebruiker is uitgegeven maar een access token voor een client. Ik heb vooralsnog geen manier gevonden binnen Passport zelf om de geauthenticeerde client te ophalen, maar o.a. https://github.com/laravel/passport/issues/124 biedt uitkomst.

Acties:
  • 0 Henk 'm!

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 09-09 12:00

TheNephilim

Wtfuzzle

Heb je de installatie wel helemaal doorgelopen? Zie https://laravel.com/docs/5.4/passport

Je kunt ook de Personal Access Token gebruiken, dan kan iedere gebruiker deze zelf genereren en gebruiken: https://laravel.com/docs/5.4/passport#personal-access-tokens

Acties:
  • 0 Henk 'm!

  • jpduits
  • Registratie: Februari 2016
  • Niet online
Uiteindelijk kan ik op deze manier de betreffende gebruiker achterhalen (bij een personal accesstoken)

PHP:
1
2
3
4
$request = request();
$bearerToken = $request->bearerToken();
$tokenId = (new Parser())->parse($bearerToken)->getHeader('jti');
$user = Token::find($tokenId)->user;
Pagina: 1