Maison  >  Article  >  développement back-end  >  Comment implémenter l'authentification Auth à l'aide de Passport dans Laravel5.5

Comment implémenter l'authentification Auth à l'aide de Passport dans Laravel5.5

小云云
小云云original
2017-12-09 09:57:541880parcourir

Laravel5.3 a commencé à utiliser Passport comme autorisation API. Passport est basé sur OAuth2. L'article suivant vous présente principalement la méthode d'utilisation de Passport pour implémenter l'authentification Auth dans Laravel5.5. code. , les amis dans le besoin peuvent s'y référer, j'espère que cela pourra aider tout le monde.

Préface

Récemment, j'écris un projet de séparation front-end et back-end, je voulais à l'origine utiliser Jwt-auth + Dingo. pour le développer, mais cela semble un peu fastidieux. J'ai donc pensé au Passport de Laravel et à la nouvelle ressource Api en 5.5. Laravel Passport est un ensemble d'implémentation de serveur OAuth2 encapsulé

OAuth est un standard de réseau ouvert pour l'autorisation, largement utilisé dans le monde. La version actuelle est la version 2.0.

OAuth 2.0 est actuellement une approche populaire, et elle a été utilisée pour la première fois par Google, Yahoo, Microsoft, Facebook, etc. La raison pour laquelle il est marqué comme 2.0 est qu'il existait à l'origine un protocole 1.0, mais ce protocole 1.0 était trop compliqué et pas facile à utiliser, il n'a donc pas été popularisé. 2.0 est un nouveau design avec un protocole simple et clair, mais il n'est pas compatible avec 1.0 et n'a rien à voir avec 1.0.

Je n’entrerai donc pas dans les détails ici, voyons d’abord comment l’installer.

Installer

Installer Passport

1. Exécutez la commande suivante dans votre Shell

composer require laravel/passport

Si la version de Laravel que vous utilisez est inférieure à 5.5, vous devez l'ajouter manuellement au tableau des fournisseurs dans le fichier config/ Fichier app.php Le code suivant

Laravel\Passport\PassportServiceProvider::class,

2. Exécutez le fichier de migration

Exécuter. comme suit dans votre commande Shell

php artisan migrate

Le fournisseur de services Passport utilise le framework pour enregistrer son propre répertoire de migration, donc après avoir enregistré le service, vous pouvez directement exécutez php artisan migrate pour fournir Passport Générez la table de données requise

3 Générez la clé de cryptage

Exécutez la commande suivante dans votre Shell

php artisan passport:install

Cette commande créera la clé de cryptage requise pour générer un jeton d'accès sécurisé. En même temps, cette commande créera également le client « Accès personnel » utilisé pour générer. le jeton d'accès et "Autorisation par mot de passe".

4. Ajouter un trait

Ajouter le trait LaravelPassportHasApiTokens au modèle AppUser

<?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. Enregistrez la route

Appelez la fonction

dans la méthode de démarrage d'AuthServiceProvider. Passport::routes

class AuthServiceProvider extends ServiceProvider
{
 public function boot()
 {
  $this->registerPolicies();
  Passport::routes();
 }
}

Si votre programme nécessite une authentification OAuth de séparation front-end et back-end au lieu d'une authentification multiplateforme, vous pouvez alors utiliser l'authentification OAuth Méthode routers() Transmettez une fonction anonyme pour personnaliser l'itinéraire que vous devez enregistrer. Voici le formulaire d'authentification qui sépare le front-end et le back-end, je n'ai donc besoin que de fournir une authentification Auth à l'un de mes clients front-end, donc J'ai uniquement enregistré l'itinéraire pour obtenir le Token, et en même temps je lui ai également donné un préfixe personnalisé.

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

6. Changez le pilote du watcher

Changez le fichier de configuration config/auth. php L'option pilote de l'API des gardes d'autorisation est remplacée par passeport. Cet ajustement permettra à votre application d'utiliser TokenGuard de Passport lors de la vérification des requêtes API entrantes, comme pour la partie front-end mentionnée dans les documents restants, car je n'ai besoin de l'utiliser que pour l'authentification Auth et je n'ai pas besoin d'implémenter la fonction OAuth complète. , nous n'avons pas du tout besoin d'utiliser la page frontale.

Utiliser

&#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;,
 ],
],

Pour faciliter le retour des données par l'API, j'ai encapsulé plusieurs fonctions


La fonction de réponse peut effectuer des retours de base réussis et échoués qui sont réencapsulés sur la fonction de réponse pour renvoyer les données de réussite et d'échec de la demande.

Ensuite, nous devons utiliser une couche de proxy.

Parlons d'abord de la raison de l'utilisation d'un proxy. Le processus d'authentification Passport est que l'application esclave prend le jeton client généré par l'application principale
function respond($status, $respond)
{
 return response()->json([&#39;status&#39; => $status, is_string($respond) ? &#39;message&#39; : &#39;data&#39; => $respond]);
}
function succeed($respond = &#39;Request success!&#39;)
{
 return respond(true, $respond);
}
function failed($respond = &#39;Request failed!&#39;)
{
 return respond(false, $respond);
}

et le mot de passe du compte saisi par l'utilisateur doit demander le passeport de l'application principale. Route de jeton pour obtenir un jeton d'accès (jeton d'accès) et un jeton d'actualisation (jeton d'actualisation), puis utiliser le jeton d'accès obtenu pour accéder à la route sous auth:api. Mais nous n'avons pas d'application subordonnée. Le front-end qui sépare le front-end demande ce jeton d'accès. Si vous souhaitez extraire ce jeton d'accès du front-end, vous devez écrire le jeton client dans le front-end. très déraisonnable, nous pouvons donc écrire un proxy en interne, et l'application elle-même prend le jeton client pour se demander d'obtenir le jeton d'accès. Cela peut être un peu déroutant, mais le processus de demande est probablement le suivant

1. . Le front-end porte le mot de passe du compte saisi par l'utilisateur. Demander au serveur

2 Le serveur reçoit le numéro de compte et le mot de passe du front-end, y ajoute Client_id et Client_token, puis demande les siens. Itinéraire d'authentification du passeport avec ces paramètres, puis retour après authentification Jeton d'accès et jeton d'actualisation

下面是代码实现,我在 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;);
 }
}

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;),
 ],
];

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(&#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)]);
}

得到的 tokens 返回如以下格式

{
 "token_type": "Bearer",
 "expires_in": 31536000,
 "access_token": "token_str",
 "refresh_token": "token_str"
}

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

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

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

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

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

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

相关推荐:

Laravel5.5中的Package Auto Discovery详情介绍

有关Laravel5.5中友好报错展示与详解

Laravel5.5新特性之报错以及展示的图文介绍

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn