Verwendung von Passport zur Implementierung der Auth-Authentifizierung in Laravel5.5

不言
Freigeben: 2023-03-31 22:10:02
Original
1398 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Verwendung von Passport zur Implementierung der Auth-Authentifizierung in Laravel5.5 vor. Er hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.

Erste Schritte mit Laravel5 .3 Passport wird als API-Autorisierung verwendet. Der folgende Artikel stellt Ihnen die Methode zur Verwendung von Passport zur Implementierung der Auth-Authentifizierung in Laravel5.5 ausführlich vor es kann sich darauf beziehen. Werfen wir einen Blick darauf.

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, warum es als 2.0 gekennzeichnet ist, liegt darin, dass es ursprünglich ein 1.0-Protokoll gab, dieses 1.0-Protokoll jedoch zu kompliziert und nicht einfach zu verwenden war, sodass es 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
Nach dem Login kopieren

Wenn die von Ihnen verwendete Laravel-Version niedriger als 5.5 ist, müssen Sie den folgenden Code manuell zum Provider-Array der Konfigurationsdatei hinzufügen. app.php-Datei

Laravel\Passport\PassportServiceProvider::class,
Nach dem Login kopieren

2. Führen Sie die Migrationsdatei aus

Führen Sie den folgenden Befehl in Ihrem aus Shell

php artisan migrate
Nach dem Login kopieren

Der Passport-Dienstanbieter verwendet das Framework, um sein eigenes Migrationsverzeichnis zu registrieren. Nach der Registrierung des Dienstes können Sie also direkt php artisan migrate ausführen, um das zu generieren Erforderliche Datentabellen für Passport

3. Verschlüsselungsschlüssel generieren

Führen Sie den folgenden Befehl in Ihrer Shell aus

php artisan passport:install
Nach dem Login kopieren

Dieser Befehl erstellt den Verschlüsselungsschlüssel, der zum Generieren eines sicheren Zugriffstokens erforderlich ist. Gleichzeitig erstellt dieser Befehl auch den „Persönlichen Zugriff“-Client und die „Passwortautorisierung“, die zum Generieren des Zugriffstokens verwendet werden.

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;
}
Nach dem Login kopieren

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();
 }
}
Nach dem Login kopieren

Wenn Ihr Programm eine Front-End- und Back-End-getrennte OAuth-Authentifizierung anstelle einer Multi-Plattform-Authentifizierung erfordert, können Sie diese in den Routern weitergeben ()-Methode Eine anonyme Funktion zum Anpassen der Route, die Sie registrieren müssen. Hier ist das Authentifizierungsformular, das das Front-End und das Back-End trennt. Daher muss ich nur einem meiner Front-End-Clients eine Auth-Authentifizierung bereitstellen Gleichzeitig habe ich die Route registriert, um das Token zu erhalten. Ein Präfixname wird dafür angepasst.

Passport::routes(function(RouteRegistrar $router) {
 $router->forAccessTokens();
},[&#39;prefix&#39; => &#39;api/oauth&#39;]);
Nach dem Login kopieren

6. Ändern Sie den Watcher-Treiber

Autorisieren Sie die Konfigurationsdatei config/auth.php Die Treiberoption der Guards-API wird in Passport geändert. Durch diese Anpassung kann Ihre Anwendung den TokenGuard von Passport verwenden, wenn sie eingehende API-Anfragen überprüft. Was den im folgenden Dokument erwähnten Front-End-Teil betrifft, da ich ihn nur für die Auth-Authentifizierung verwenden muss und nicht die vollständige OAuth-Funktion implementieren muss. Wir müssen die Frontend-Seite überhaupt nicht verwenden.

Verwenden Sie

Um die Rückgabe von Daten durch die API zu vereinfachen, habe ich mehrere Funktionen gekapselt

&#39;guards&#39; => [
 &#39;web&#39; => [
  &#39;driver&#39; => &#39;session&#39;,
  &#39;provider&#39; => &#39;users&#39;,
 ],
 &#39;api&#39; => [
  &#39;driver&#39; => &#39;passport&#39;,
  &#39;provider&#39; => &#39;users&#39;,
 ],
],
Nach dem Login kopieren

Die Antwortfunktion kann dafür sorgen, dass grundlegende Rückgaben erfolgreich und fehlgeschlagen sind und in der Antwortfunktion neu gekapselt werden, um Anforderungserfolgs- und Anforderungsfehlerdaten zurückzugeben.

Dann müssen wir eine Proxy-Ebene verwenden.

Lassen Sie uns zunächst über den Grund für die Verwendung eines Proxys sprechen. Der Prozess der Passport-Authentifizierung besteht darin, dass die Slave-Anwendung das von der Hauptanwendung generierte Client-Token

und das eingegebene Kontokennwort verwendet Der Benutzer fordert den Passport der Hauptanwendungs-Token-Route an, um ein Zugriffstoken (Zugriffstoken) und ein Aktualisierungstoken (Aktualisierungstoken) zu erhalten, und verwendet dann das erhaltene Zugriffstoken, um auf die Route unter auth:api zuzugreifen. Wir haben jedoch keine untergeordnete Anwendung, die das Front-End vom Front-End trennt. Wenn Sie dieses Zugriffstoken vom Front-End abrufen möchten, müssen Sie das Client-Token in das Front-End schreiben sehr unvernünftig, daher können wir intern einen Proxy schreiben und die Anwendung selbst fordert den Zugriffstoken selbst an. Dies kann etwas verwirrend sein, aber der Anforderungsprozess ist wahrscheinlich wie folgt

1 . Das Frontend trägt das vom Benutzer eingegebene Kontopasswort


2.服务端带着从前端接收到账号与密码,并在其中添加 Client_id 与 Client_token,然后带着这些参数请求自身的 Passport 认证路由,然后返回认证后的 Access token 与 refresh token

下面是代码实现,我在 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() . &#39;/api/oauth/token&#39;;
   $params = array_merge(config(&#39;passport.proxy&#39;), [
    &#39;username&#39; => request(&#39;email&#39;),
    &#39;password&#39; => request(&#39;password&#39;),
   ]);
   $respond = $client->request(&#39;POST&#39;, $url, [&#39;form_params&#39; => $params]);
  } catch (RequestException $exception) {
   throw new UnauthorizedException(&#39;请求失败,服务器错误&#39;);
  }
  if ($respond->getStatusCode() !== 401) {
   return json_decode($respond->getBody()->getContents(), true);
  }
  throw new UnauthorizedException(&#39;账号或密码错误&#39;);
 }
}
Nach dem Login kopieren

config/passport.php 内容如下

<?php
return [
 &#39;proxy&#39; => [
  &#39;grant_type&#39; => env(&#39;OAUTH_GRANT_TYPE&#39;),
  &#39;client_id&#39;  => env(&#39;OAUTH_CLIENT_ID&#39;),
  &#39;client_secret&#39; => env(&#39;OAUTH_CLIENT_SECRET&#39;),
  &#39;scope&#39;   => env(&#39;OAUTH_SCOPE&#39;, &#39;*&#39;),
 ],
];
Nach dem Login kopieren

env 文件内容如下

OAUTH_GRANT_TYPE=password
OAUTH_CLIENT_ID=2
OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O
OAUTH_SCOPE=*
Nach dem Login kopieren

我们需要用到的 client token 是 id 为 2 的 client token,不要搞错了哟~

然后我们只需要在控制器中 use 这个 Trait,然后调用 $this->authenticate() 就可以得到认证成功的 token,如果请求失败的话,你可以使用 catch 来捕捉错误抛出异常。

 public function login(Request $request)
{
  $needs = $this->validate($request, rules(&#39;login&#39;));
  $user = User::where(&#39;email&#39;, $needs[&#39;email&#39;])->first();

  if (!$user) {
   throw new UnauthorizedException(&#39;此用户不存在&#39;);
  }
  $tokens = $this->authenticate();
  return succeed([&#39;token&#39; => $tokens, &#39;user&#39; => new UserResource($user)]);
}
Nach dem Login kopieren

得到的 tokens 返回如以下格式

{
 "token_type": "Bearer",
 "expires_in": 31536000,
 "access_token": "token_str",
 "refresh_token": "token_str"
}
Nach dem Login kopieren

做完这一切后你就可以在前端向这样子请求服务端了

axios.post(&#39;yourdomain/login&#39;,login_form).then(resource => { 
})
Nach dem Login kopieren

如果请求成功,那么你将会得到 用户的信息和 access token,refresh token。

然后在你的前端 http 请求 header 里需要加入一个参数 Authorization

axios.defaults.headers.common[&#39;Authorization&#39;] = token.token_type + &#39; &#39; + token.access_token
Nach dem Login kopieren

然后在你需要使用到 auth 认证的路由里使用中间件 auth:api,一切就大功告成啦~

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Laravel5.2使用Captcha生成验证码实现登录的方法

关于Laravel中日期时间处理包Carbon的使用

关于laravel 5.1下php artisan migrate的使用

Das obige ist der detaillierte Inhalt vonVerwendung von Passport zur Implementierung der Auth-Authentifizierung in Laravel5.5. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!