ホームページ  >  記事  >  PHPフレームワーク  >  laravelでのAPIルーティングのauth:apiとapi_tokenの作業

laravelでのAPIルーティングのauth:apiとapi_tokenの作業

藏色散人
藏色散人転載
2021-04-30 09:23:052238ブラウズ

laravel の次のチュートリアル コラムでは、laravel での API ルーティングの auth:api と api_token について紹介します。

laravelでAPIルーティングのauth:apiとapi_tokenをやってみよう

最近たまたまこのことを考えていて、情報を探していたときにもこの問題を発見しました。ちなみに、将来「なぜ?」と聞かれないように、プロセスについて書きましたが、長時間検索しても中国語の情報は見つかりませんでした。個人的なメモのようなもので、あまりドライではありません


質問のアドレス:

https://segmentfault.com/q/1010000008388170/a-1020000009910771

このもの (トークンベースの認証) は、 5.2. それでは始めましょう:

最初に見てみましょう

/config/authguards フィールド:

  'guards' => [
      'web' => [
          'driver' => 'session',
          'provider' => 'users',
      ],
  
      'api' => [
          'driver' => 'token',
          'provider' => 'users',
      ],
  ]
上記 2 つのことについて (ガード)、パス

{project}/vendor/laravel/framework/src /Illuminate/Auth/SessionGuard.php および {project}/vendor/laravel/framework/src/Illuminate/Auth /TokenGuard.php は内部に表示されます。

TokenGuard 内に

user() メソッドが表示されます。例: Auth::user() はユーザーを返し、このメソッドが呼び出されます。

次に、

{project}/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php を見てください。この中の #guard メソッドは Auth::guard('api')-&gt ;check() または Auth::check() が呼び出されるメソッドですコードが実行されると何が行われるのか<pre class="brush:php;toolbar:false">  public function guard($name = null)   {       //这里就是没有提供名字,就默认用web       $name = $name ?: $this-&gt;getDefaultDriver();       //然后如果已经有这个guard,就返回; 没有的话,就resolve这个名字       return isset($this-&gt;guards[$name])                   ? $this-&gt;guards[$name]                   : $this-&gt;guards[$name] = $this-&gt;resolve($name);   }</pre>次に、

解決策を見てみましょう

私がやったこと<pre class="brush:php;toolbar:false">    protected function resolve($name)     {         $config = $this-&gt;getConfig($name);         if (is_null($config)) {             throw new InvalidArgumentException(&quot;Auth guard [{$name}] is not defined.&quot;);         }         if (isset($this-&gt;customCreators[$config['driver']])) {             return $this-&gt;callCustomCreator($name, $config);         }         $driverMethod = 'create'.ucfirst($config['driver']).'Driver';         if (method_exists($this, $driverMethod)) {             return $this-&gt;{$driverMethod}($name, $config);         }         throw new InvalidArgumentException(&quot;Auth guard driver [{$name}] is not defined.&quot;);     }</pre>最初のステップ

getConfig

:<pre class="brush:php;toolbar:false">    protected function getConfig($name)     {         return $this-&gt;app['config'][&quot;auth.guards.{$name}&quot;];     }</pre>最初の項目に記載されている

config/auth

の設定に移動します。たとえば、api は、設定項目を取得した後、<pre class="brush:php;toolbar:false">      [           'driver' =&gt; 'token',           'provider' =&gt; 'users',       ],</pre> を取得します。対応する名前のドライバーを持つカスタムがある場合は、

resolve

<pre class="brush:php;toolbar:false">    $driverMethod = 'create'.ucfirst($config['driver']).'Driver';     if (method_exists($this, $driverMethod)) {         return $this-&gt;{$driverMethod}($name, $config);     }</pre> を続行し、呼び出します (これはデフォルトの 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
:<pre class="brush:php;toolbar:false">public function user()     {         if (! is_null($this-&gt;user)) {             return $this-&gt;user;         }         $user = null;         $token = $this-&gt;getTokenForRequest();         if (! empty($token)) {             $user = $this-&gt;provider-&gt;retrieveByCredentials(                 [$this-&gt;storageKey =&gt; $token]             );         }         return $this-&gt;user = $user;     }</pre> をインスタンス化しました。既存のユーザーが存在する場合は、

getTokenForRequest

を使用してユーザーを作成します。<pre class="brush:php;toolbar:false">    public function getTokenForRequest()     {         $token = $this-&gt;request-&gt;query($this-&gt;inputKey);                  if (empty($token)) {             $token = $this-&gt;request-&gt;input($this-&gt;inputKey);         }         if (empty($token)) {             $token = $this-&gt;request-&gt;bearerToken();         }         if (empty($token)) {             $token = $this-&gt;request-&gt;getPassword();         }         return $token;     }</pre>基本的に、私たちは次のことを扱っています。リクエストの

$this->inputKey

フィールド。これを強調表示します。 属性はコンストラクターでデフォルト設定されます: $this->inputKey = 'api_token'
.つまり、API リクエストには、

[
  api_token => '  一堆随便什么字符串OUVjkknag89s8c987235iohiscovy89q235 '
]

ドキュメント内でそれが見つかりませんでした。

結論は非常に簡単です。 laravel 独自の

auth:api

を使用して API を作成する場合は、

あなたの投稿または検証する必要がある API リクエストapi_token フィールドが必要です。
  • これはユーザー テーブルにある必要があります。フィールド api_token、bcrypt anything があります。
  • 次に、
  • routes/ api

    は、テストする API ルートを大量に作成できます。

  • その後、公式 Web サイトの
passport

ドキュメントなどを確認できます。

関連する推奨事項:
最新の 5 つの Laravel ビデオ チュートリアル

以上がlaravelでのAPIルーティングのauth:apiとapi_tokenの作業の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。