Maison > cadre php > Laravel > Travailler sur auth:api et api_token du routage API dans Laravel

Travailler sur auth:api et api_token du routage API dans Laravel

藏色散人
Libérer: 2021-05-13 09:02:22
avant
2253 Les gens l'ont consulté

La colonne tutorielle suivante de laravel vous présentera auth:api et api_token du routage api dans laravel. J'espère qu'elle sera utile aux amis dans le besoin !

Travailler sur auth:api et api_token du routage api dans laravel

Je pensais juste à cette chose ces jours-ci, et j'ai également trouvé ce problème lorsque je cherchais des informations. de cette façon, j'écrirai à ce sujet, au cas où quelqu'un voudrait demander pourquoi plus tard, mais ne trouve aucune information chinoise après une longue recherche. C'est comme des notes personnelles et pas très sèches

.

L'adresse de la question :
https://segmentfault.com/q/1010000008388170/a-1020000009910771

Cette chose (authentification basée sur un jeton) est apparue dans la version 5.2. :

Regardez d'abord/config/auth Le champ guards dans :

  'guards' => [
      'web' => [
          'driver' => 'session',
          'provider' => 'users',
      ],
  
      'api' => [
          'driver' => 'token',
          'provider' => 'users',
      ],
  ]
Copier après la connexion

Pour les deux choses ci-dessus (gardes), elles peuvent être vues dans les chemins {project}/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php et {project}/vendor/laravel/framework/src/Illuminate/Auth/TokenGuard.php.

peut être vu dans la méthode TokenGuarduser(), telle que Auth::user() renverra un utilisateur, et cette méthode est appelée

Ensuite, regardez {project}/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php, la méthode guard. dans ceci est Auth::guard('api')->check() ou Auth::check() ou quelque chose comme ça La méthode qui sera appelée lorsque le code sera exécuté ? Que fait-elle ?

  public function guard($name = null)
  {
      //这里就是没有提供名字,就默认用web
      $name = $name ?: $this->getDefaultDriver();
      //然后如果已经有这个guard,就返回; 没有的话,就resolve这个名字
      return isset($this->guards[$name])
                  ? $this->guards[$name]
                  : $this->guards[$name] = $this->resolve($name);
  }
Copier après la connexion

Alors voyons ce que resolve fait

    protected function resolve($name)
    {
        $config = $this->getConfig($name);

        if (is_null($config)) {
            throw new InvalidArgumentException("Auth guard [{$name}] is not defined.");
        }

        if (isset($this->customCreators[$config['driver']])) {
            return $this->callCustomCreator($name, $config);
        }

        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';

        if (method_exists($this, $driverMethod)) {
            return $this->{$driverMethod}($name, $config);
        }

        throw new InvalidArgumentException("Auth guard driver [{$name}] is not defined.");
    }
Copier après la connexion
.

La première étapegetConfig :

    protected function getConfig($name)
    {
        return $this->app['config']["auth.guards.{$name}"];
    }
Copier après la connexion

Recherchez les éléments de configuration dans config/auth mentionnés au début. Par exemple, api obtiendra

      [
          'driver' => 'token',
          'provider' => 'users',
      ],
Copier après la connexion

Après avoir obtenu la configuration. éléments, continuez resolve

    $driverMethod = 'create'.ucfirst($config['driver']).'Driver';

    if (method_exists($this, $driverMethod)) {
        return $this->{$driverMethod}($name, $config);
    }
Copier après la connexion
dans

s'il existe Appelez le pilote personnalisé avec le nom correspondant (c'est avant les deux par défaut)
S'il existe un pilote intégré, appelez le méthode. Passez createXXXXXDriver et $name.$config

Puis continuez la lecture :

public function createTokenDriver($name, $config)
    {
        // The token guard implements a basic API token based guard implementation
        // that takes an API token field from the request and matches it to the
        // user in the database or another persistence layer where users are.
        $guard = new TokenGuard(
            $this->createUserProvider($config['provider']),
            $this->app['request']
        );

        $this->app->refresh('request', $guard, 'setRequest');

        return $guard;
    }
Copier après la connexion
Notez que l'utilisateur ici n'est pas forcément créé dans la base de données. Il peut aussi être ailleurs, mais cela dépend de votre fournisseur. Le fournisseur ici dans Laravel est par défaut EloquentUserProvider, donc évidemment Haha, vous ne pouvez le trouver qu'à partir de la table de la base de données

Instancier un
 : TokenGuard

public function user()
    {
        if (! is_null($this->user)) {
            return $this->user;
        }

        $user = null;

        $token = $this->getTokenForRequest();

        if (! empty($token)) {
            $user = $this->provider->retrieveByCredentials(
                [$this->storageKey => $token]
            );
        }

        return $this->user = $user;
    }
Copier après la connexion
S'il y en a un. utilisateur existant, utilisez

pour en créer un.getTokenForRequest

    public function getTokenForRequest()
    {
        $token = $this->request->query($this->inputKey);
        
        if (empty($token)) {
            $token = $this->request->input($this->inputKey);
        }

        if (empty($token)) {
            $token = $this->request->bearerToken();
        }

        if (empty($token)) {
            $token = $this->request->getPassword();
        }

        return $token;
    }
Copier après la connexion
traite essentiellement du champ

dans la requête $this->inputKey Cet attribut est par défaut dans le constructeur :
. Autrement dit, dans votre demande d'API, il devrait y avoir A $this->inputKey = 'api_token'

[
  api_token => '  一堆随便什么字符串OUVjkknag89s8c987235iohiscovy89q235 '
]
Copier après la connexion

Une telle chose

Je ne l'ai vraiment pas trouvé dans la documentation.

Ensuite, la conclusion est très simple maintenant, si vous souhaitez utiliser celui de Laravel

Pour écrire l'APIauth:api, alors :

Votre message ou toute demande d'API qui doit être vérifiée doit avoir un api_token field.
  • Vous Il devrait y avoir un champ api_token dans la table utilisateur, bcrypt n'importe quoi
  • Ensuite, vous
  • pouvez écrire un tas de routes API. pour tester.

    routes/api

  • Ensuite, vous pouvez consulter la documentation
du site officiel et autres.

passport

Recommandations associées :
Les cinq derniers didacticiels vidéo Laravel

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!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal