Laravel5.3 hat begonnen, Passport als API-Autorisierung zu verwenden. Der folgende Artikel stellt Ihnen hauptsächlich die Methode zur Verwendung von Passport zur Implementierung der Auth-Authentifizierung in Laravel5.5 vor Code, Freunde in Not können sich darauf beziehen, ich hoffe, es kann allen helfen.
Vorwort
Vor kurzem schreibe ich ein Front-End- und Back-End-Trennprojekt, das ich ursprünglich Jwt-auth + Dingo verwenden wollte um es zu entwickeln, aber es fühlt sich etwas umständlich an. Also dachte ich an Laravel's Passport und die neue API-Ressource in 5.5. Laravel Passport ist eine Reihe gekapselter OAuth2-Serverimplementierungen
OAuth ist ein offener Netzwerkstandard für die Autorisierung, der weltweit weit verbreitet ist. Die aktuelle Version ist Version 2.0.
OAuth 2.0 ist derzeit ein beliebter Ansatz und wurde zuerst von Google, Yahoo, Microsoft, Facebook usw. verwendet. Der Grund für die Kennzeichnung als 2.0 liegt darin, dass es ursprünglich ein 1.0-Protokoll gab, dieses 1.0-Protokoll jedoch zu kompliziert und nicht einfach zu verwenden war und daher nicht populär gemacht wurde. 2.0 ist ein neues Design mit einem einfachen und klaren Protokoll, aber es ist nicht mit 1.0 kompatibel und hat nichts mit 1.0 zu tun.
Da ich hier nicht auf Details eingehen möchte, werfen wir zunächst einen Blick auf die Installation.
Installieren
Passport installieren
1. Führen Sie den folgenden Befehl in Ihrer Shell aus
composer require laravel/passport
Wenn die von Ihnen verwendete Laravel-Version niedriger als 5.5 ist, müssen Sie sie manuell zum Provider-Array in der Konfigurations-/ app.php-Datei Der folgende Code
Laravel\Passport\PassportServiceProvider::class,
2. Führen Sie die Migrationsdatei aus
Ausführen wie folgt in Ihrem Shell-Befehl
php artisan migrate
Der Passport-Dienstanbieter verwendet das Framework, um sein eigenes Migrationsverzeichnis zu registrieren. Nach der Registrierung des Dienstes können Sie dies also direkt tun Führen Sie php artisan migrate aus, um Passport bereitzustellen. Generieren Sie die erforderliche Datentabelle
3. Generieren Sie den Verschlüsselungsschlüssel
Führen Sie den folgenden Befehl in Ihrer Shell aus
php artisan passport:install
Dieser Befehl erstellt den Verschlüsselungsschlüssel, der zum Generieren eines sicheren Zugriffstokens erforderlich ist. Gleichzeitig erstellt dieser Befehl auch den „Personal Access“-Client, der zum Generieren verwendet wird das Zugriffstoken und „Passwortautorisierung“.
4. Merkmal hinzufügen
LaravelPassportHasApiTokens-Merkmal zum AppUser-Modell hinzufügen
<?php namespace App; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasApiTokens, Notifiable; }
5. Route registrieren
Rufen Sie die Funktion Passport::routes
in der Boot-Methode von AuthServiceProvider auf.
class AuthServiceProvider extends ServiceProvider { public function boot() { $this->registerPolicies(); Passport::routes(); } }
Wenn Ihr Programm eine OAuth-Authentifizierung mit Front-End- und Back-End-Trennung anstelle einer Multiplattform-Authentifizierung erfordert, können Sie die verwenden routers()-Methode Übergeben Sie eine anonyme Funktion, um die Route anzupassen, die Sie registrieren müssen. Hier ist das Authentifizierungsformular, das das Front-End und das Back-End trennt, sodass ich nur einem meiner Front-End-Clients eine Auth-Authentifizierung bereitstellen muss Ich habe nur die Route registriert, um das Token zu erhalten, und ihr gleichzeitig ein benutzerdefiniertes Präfix gegeben.
Passport::routes(function(RouteRegistrar $router) { $router->forAccessTokens(); },['prefix' => 'api/oauth']);
6. Ändern Sie den Watcher-Treiber
Ändern Sie die Konfigurationsdatei config/auth. php Die Treiberoption der API des Authorization Guard Guards wird in Passport geändert. Durch diese Anpassung kann Ihre Anwendung den TokenGuard von Passport bei der Überprüfung eingehender API-Anfragen verwenden, wie für den in den übrigen Dokumenten erwähnten Front-End-Teil, da ich ihn nur für die Auth-Authentifizierung verwenden muss und nicht die vollständige OAuth-Funktion implementieren muss , müssen wir die Frontend-Seite überhaupt nicht verwenden.
Verwenden Sie'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
Um die Rückgabe von Daten durch die API zu vereinfachen, habe ich mehrere Funktionen
< gekapselt 🎜>
function respond($status, $respond) { return response()->json(['status' => $status, is_string($respond) ? 'message' : 'data' => $respond]); } function succeed($respond = 'Request success!') { return respond(true, $respond); } function failed($respond = 'Request failed!') { return respond(false, $respond); }
2 Der Server erhält die Kontonummer und das Passwort vom Frontend, fügt Client_id und Client_token hinzu und fordert dann sein eigenes an Pass-Authentifizierungsroute mit diesen Parametern und kehrt dann nach der Authentifizierung zum Zugriffstoken und Aktualisierungstoken zurück
下面是代码实现,我在 AppHttpControllersTraits 下新建了一个 ProxyHelpers 的 Trait,当然,这个函数是我根据我的业务逻辑自己封装的,如果不适合你的业务逻辑你可以自行调整。
<?php namespace App\Http\Controllers\Traits; use GuzzleHttp\Client; use App\Exceptions\UnauthorizedException; use GuzzleHttp\Exception\RequestException; trait ProxyHelpers { public function authenticate() { $client = new Client(); try { $url = request()->root() . '/api/oauth/token'; $params = array_merge(config('passport.proxy'), [ 'username' => request('email'), 'password' => request('password'), ]); $respond = $client->request('POST', $url, ['form_params' => $params]); } catch (RequestException $exception) { throw new UnauthorizedException('请求失败,服务器错误'); } if ($respond->getStatusCode() !== 401) { return json_decode($respond->getBody()->getContents(), true); } throw new UnauthorizedException('账号或密码错误'); } }
config/passport.php 内容如下
<?php return [ 'proxy' => [ 'grant_type' => env('OAUTH_GRANT_TYPE'), 'client_id' => env('OAUTH_CLIENT_ID'), 'client_secret' => env('OAUTH_CLIENT_SECRET'), 'scope' => env('OAUTH_SCOPE', '*'), ], ];
env 文件内容如下
OAUTH_GRANT_TYPE=password OAUTH_CLIENT_ID=2 OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O OAUTH_SCOPE=*
我们需要用到的 client token 是 id 为 2 的 client token,不要搞错了哟~
然后我们只需要在控制器中 use 这个 Trait,然后调用 $this->authenticate()
就可以得到认证成功的 token,如果请求失败的话,你可以使用 catch 来捕捉错误抛出异常。
public function login(Request $request) { $needs = $this->validate($request, rules('login')); $user = User::where('email', $needs['email'])->first(); if (!$user) { throw new UnauthorizedException('此用户不存在'); } $tokens = $this->authenticate(); return succeed(['token' => $tokens, 'user' => new UserResource($user)]); }
得到的 tokens 返回如以下格式
{ "token_type": "Bearer", "expires_in": 31536000, "access_token": "token_str", "refresh_token": "token_str" }
做完这一切后你就可以在前端向这样子请求服务端了
axios.post('yourdomain/login',login_form).then(resource => { })
如果请求成功,那么你将会得到 用户的信息和 access token,refresh token。
然后在你的前端 http 请求 header 里需要加入一个参数 Authorization
axios.defaults.headers.common['Authorization'] = token.token_type + ' ' + token.access_token
然后在你需要使用到 auth 认证的路由里使用中间件 auth:api,一切就大功告成啦~
相关推荐:
Laravel5.5中的Package Auto Discovery详情介绍
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Auth-Authentifizierung mit Passport in Laravel5.5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!