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.
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?
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?
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)}
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.
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!
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.
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]