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

藏色散人
藏色散人avant
2021-04-30 09:23:052279parcourir

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',
      ],
  ]

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);
  }

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.");
    }
.

La première étapegetConfig :

    protected function getConfig($name)
    {
        return $this->app['config']["auth.guards.{$name}"];
    }

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

      [
          'driver' => 'token',
          'provider' => 'users',
      ],

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);
    }
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;
    }
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;
    }
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;
    }
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 '
]

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer