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