https://segmentfault.com/q/1010000008388170/a-1020000009910771
/config/auth の
guards フィールド:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ]
{project}/vendor/laravel/framework/src /Illuminate/Auth/SessionGuard.php および
{project}/vendor/laravel/framework/src/Illuminate/Auth /TokenGuard.php は内部に表示されます。
user() メソッドが表示されます。例:
Auth::user() はユーザーを返し、このメソッドが呼び出されます。
{project}/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php を見てください。この中の #guard
メソッドは Auth::guard('api')-> ;check()
または Auth::check()
が呼び出されるメソッドですコードが実行されると何が行われるのか<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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);
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
次に、
私がやったこと<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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.");
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
最初のステップ
:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> protected function getConfig($name)
{
return $this->app['config']["auth.guards.{$name}"];
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
最初の項目に記載されている
の設定に移動します。たとえば、api
は、設定項目を取得した後、<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> [
'driver' => 'token',
'provider' => 'users',
],</pre><div class="contentsignin">ログイン後にコピー</div></div>
を取得します。対応する名前のドライバーを持つカスタムがある場合は、
で <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> $driverMethod = 'create'.ucfirst($config['driver']).'Driver';
if (method_exists($this, $driverMethod)) {
return $this->{$driverMethod}($name, $config);
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
を続行し、呼び出します (これはデフォルトの 2 つより前です)
createXXXXXDriver
メソッドを呼び出します。$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; }
Noteここのユーザーは必ずしもデータベースに作成されているわけではありません。他の場所にある可能性もありますが、プロバイダーによって異なります。laravel ここのプロバイダーはデフォルトで EloquentUserProvider になっているため、明らかに、データベース テーブルからのみ見つけることができます。
TokenGuard
:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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;
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
をインスタンス化しました。既存のユーザーが存在する場合は、
を使用してユーザーを作成します。<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false"> 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;
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
基本的に、私たちは次のことを扱っています。リクエストの
フィールド。これを強調表示します。 属性はコンストラクターでデフォルト設定されます:
$this->inputKey = 'api_token'
.つまり、API リクエストには、
[ api_token => ' 一堆随便什么字符串OUVjkknag89s8c987235iohiscovy89q235 ' ]
ドキュメント内でそれが見つかりませんでした。
結論は非常に簡単です。 laravel 独自の
auth:api を使用して API
を作成する場合は、
- これはユーザー テーブルにある必要があります。フィールド api_token、bcrypt anything があります。
- 次に、
- routes/ api
は、テストする API ルートを大量に作成できます。
その後、公式 Web サイトの
ドキュメントなどを確認できます。