webentwicklung-frage-antwort-db.com.de

Wie verwende ich Laravel Passport with Password Grant Tokens?

Ich habe gerade die https://laravel.com/docs/5.6/passport Dokumentation gelesen und habe einige Zweifel, bei denen mir hoffentlich jemand helfen könnte:

Zunächst möchte ich in einem bestimmten Kontext Passport verwenden, um Oauth Authentifizierung für meine mobile App (Erstanbieter-App) bereitzustellen.

  1. Wenn ich php artisan passport:client --password Verwende, erhalte ich eine Kunden-ID und ein Kundengeheimnis zurück. Muss dieser Wert in meiner App festgelegt werden? Zum Beispiel, um sie fest zu speichern oder als "Settings" -Datei? Wenn die Werte nicht gespeichert werden sollen, wie soll es dann funktionieren?

  2. Um einen Benutzer in meiner App zu registrieren, benutze ich: $user->createToken('The-App')->accessToken; Ich bekomme, dass das accessToken dasjenige ist, das für das Versenden aller meiner Anfragen als Header verwendet wird (Authorization => Bearer $ accessToken), aber was genau ist "The -App "Wert für?

  3. Für die Anmeldung benutze ich die URL: http://example.com/oauth/token und sende als Parameter:

    {"Benutzername": "[email protected]", "Passwort": "Benutzerpasswort", "Grant-Typ": "Passwort", "Client-ID": 1, // Die Client-ID, die ich vom Befehl erhalten habe (Frage 1) "client_secret": "Shhh" // Das Client-Geheimnis, das ich vom Befehl erhalten habe (Frage 1)}

  4. Wenn ich den Benutzer mit dem vorherigen Endpunkt anmelde, erhalte ich ein refresh_token zurück. Ich habe gelesen, dass ich das Token durch http://example.com/oauth/token/refresh aktualisieren kann, aber ich versuche, das anzufordern Aktualisieren Ich habe den Fehler 419 erhalten. Ich habe die URL oauth/token/refresh aus der CSRF-Überprüfung entfernt und erhalte jetzt wieder "message": "Unauthenticated.". Ich mache die folgende Anfrage:

    Inhaltstyp: x-www-form-urlencoded Grant-Typ: refresh_token refresh_token: the-refresh-token // Das Aktualisierungstoken, das ich vom Befehl erhalten habe (Frage 3) client_id: 1 // Die Client-ID, die ich vom Befehl erhalten habe (Frage 1) client_secret: Shhh // Das Client-Geheimnis, das ich vom Gültigkeitsbereich des Befehls (Frage 1) erhalten habe: ''

Soll ich diesen Endpunkt verwenden? oder ist nicht notwendig angesichts der App, die ich zu entwickeln versuche.

  1. Schließlich gibt es eine Reihe von Endpunkten, die ich aus dem Pass bekomme und die ich nicht verwenden werde. Zum Beispiel: oauth/clients*, oauth/personal-access-tokens* Gibt es eine Möglichkeit, sie von den von veröffentlichten Endpunkten zu entfernen Reisepass?

Vielen dank für Deine Hilfe!

15
JohnnyAce

Wenn Sie Ihre eigene API verwenden, müssen Sie für die Benutzeranmeldung nicht http://example.com/oauth/token aufrufen, da Sie dann client_id und client_secret auf der App-Seite speichern müssen. Besser erstellen Sie eine API für die Anmeldung und dort können Sie die Anmeldeinformationen überprüfen und das persönliche Token generieren.

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);
        }
}

Schließlich gibt es eine Reihe von Endpunkten, die ich aus einem Reisepass erhalte, von denen ich glaube, dass sie nicht verwendet werden: oauth/clients *, oauth/personal-access-tokens * Gibt es eine Möglichkeit, sie von den von veröffentlichten Endpunkten zu entfernen Reisepass?

Sie müssen Passport::routes(); aus AuthServiceProvider entfernen und nur die erforderlichen Passrouten manuell eingeben. Ich denke, Sie brauchen nur die Route oauth/token.

wofür genau ist "The-App" wert?

wenn Sie oauth_access_tokens überprüfen, hat es ein Namensfeld. $user->createToken('Token Name')->accessToken; hier das "Token Name" im Namensfeld.

Wie verwende ich Laravel Passport with Password Grant Tokens?

Um ein Passwort-Grant-Token zu generieren, müssen Sie client_id Und client_secret Auf der App-Seite speichern (nicht empfohlen, aktivieren Sie this ) und nehmen an, dass Sie das client_secret Dann funktioniert die App der alten Version nicht mehr, das sind die Probleme. Um ein Passwort-Grant-Token zu generieren, müssen Sie diese API aufrufen, wie Sie in Schritt 3 erwähnt haben.

$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);

Token generieren aus 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);

Sie können dies ansehen https://laravel.com/docs/5.6/passport#implicit-grant-tokens auch.

26
rkj

Bewältigung von Frage 5

Schließlich gibt es eine Reihe von Endpunkten, die ich aus dem Pass bekomme und die ich nicht verwenden werde. Zum Beispiel: oauth/clients*, oauth/personal-access-tokens* Gibt es eine Möglichkeit, sie von den von veröffentlichten Endpunkten zu entfernen Reisepass?


Passport::routes($callback = null, array $options = []) akzeptiert eine optionale $callback - Funktion und ein optionales $options - Argument.

Die Rückruffunktion verwendet ein Argument $router, Aus dem Sie auswählen können, welche Routen installiert werden sollen, wie unten in Ihrem AuthServiceProvider.php Gezeigt, das eine detailliertere Konfiguration ermöglicht:

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

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

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

Auf diese Weise erstellen wir nur die Passrouten, die wir benötigen.

forAccessTokens(); Ermöglichen Sie es uns, Zugriffstoken zu erstellen.
forPersonalAccessTokens(); Ermöglichen Sie es uns, persönliche Token zu erstellen, obwohl wir dies in diesem Artikel nicht verwenden. Zuletzt forTransientTokens(); Erstellt die Route für die Aktualisierung von Tokens.

Wenn Sie php artisan route:list Ausführen, werden die neuen Endpunkte angezeigt, die von Laravel Passport) installiert wurden.

| POST | oauth/token         | \Laravel\Passport\Http\Controllers\[email protected]
| POST | oauth/token/refresh | \Laravel\Passport\Http\Controllers\[email protected]
0
Dan White