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
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 :
- 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