2017-07-10 68 views
6

Buduję interfejs API i używam paszportu Laravel do uwierzytelniania.Jak mogę utworzyć token dla klienta udzielającego haseł przy użyciu Laravel Passport?

Interfejs API jest używany w naszej aplikacji mobilnej, więc korzystamy z klienta udzielającego haseł.

Wszystko działa wspaniale, a użytkownik może się zalogować, aby uzyskać token dostępu. Stworzyliśmy punkt końcowy rejestru, który pozwala użytkownikowi zarejestrować się. Potrzebujemy również API do zwrócenia tokena dostępu w tym momencie.

Przeglądając dokumenty, nie można programowo utworzyć tokena dostępu.

Jak utworzyć token dostępu dla klienta udzielającego haseł w moim kontrolerze? Oczywiście nie chcę zrobić żądania HTTP do mojego własnego API, aby je uzyskać.

Wiem, że mogę korzystać z klienta dostępu do danych osobistych i dzwonić pod numer createToken w modelu użytkownika, ale to oznacza, że ​​token dostępu jest powiązany z innym klientem. Nie wydaje mi się to właściwe.

Odpowiedz

0

wiem, że mogę używać klienta osobowych Dostęp Grant i nazywają createToken modelu użytkownika, ale to oznacza, że ​​żeton dostępu jest związany z innym klientem

Nie wiem, co masz na myśli, czy możesz wyjaśnić więcej?

Teraz to nie jest idealne, ale może być w stanie wstrzyknąć \League\OAuth2\Server\Grant\PasswordGrant i używać

respondToAccessTokenRequest(ServerRequestInterface $request 
          ResponseTypeInterface $responseType, 
          \DateInterval $accessTokenTTL) 

trzeba by zbudować wszystkie te obiekty, ale jest to jedyna metoda publiczna o hasło, które zwraca żadnej tokena informacji.

2

Przez kilka tygodni bawiłem się w usłudze Passport iz tego, co widziałem w dokumentacji, nie ujawniło się wielu metod używanych do tworzenia tokenów. Choć może nie być łatwo "utworzyć token dostępu dla klienta udzielającego haseł w moim kontrolerze" - możesz użyć numeru Route::dispatch, aby przesłać żądanie tokena na trasę graniczną przy użyciu hasła paszportowego.

Aby to zrobić w sterowniku używasz do wydawania tokenów, użyj cechę AuthenticatesUsers więc masz dostęp do trasy Hasło Grant, utwórz zgłoszenie, i wysyłka że żądać trasie Hasło Grant:

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Route; 
use Illuminate\Foundation\Auth\AuthenticatesUsers; 

class IssueTokensController extends Controller 
{ 

    use AuthenticatesUsers; 

    protected function issueApiToken(Request $request) 
    { 
     // forward the request to the oauth token request endpoint 
     $tokenRequest = Request::create(
      '/oauth/token', 
      'post' 
     ); 
     return Route::dispatch($tokenRequest); 
    } 

} 

Ta metoda wymaga oczywiście skonfigurowania usługi Passport i Password Grant Client.

Ta odpowiedź jest oparty off innej odpowiedzi na podobne pytanie Raymond Lagonda - patrz https://stackoverflow.com/a/40433000/4991377

1
Try something like this 
namespace App\Http\Controllers\Api; 

use Illuminate\Http\Request; 
use App\Http\Controllers\Controller; 
use Illuminate\Support\Facades\Route; 
use App\User; 

class UserController extends Controller 
{ 

    //use AuthenticatesUsers; 
    protected function login(Request $request) 
    { 

     $request->request->add([ 
       'grant_type' => 'password', 
       'client_id'  => '3', 
       'client_secret' => '6BHCRpB4tpXnQvC1DmpT7CXCSz7ukdw7IeZofiKn', 
       'scope' => '*' 
      ]); 

     // forward the request to the oauth token request endpoint 
     $tokenRequest = Request::create('/oauth/token','post'); 
     return Route::dispatch($tokenRequest); 
    } 

}