这个$ key是什么?它从哪里来?

时间:2019-12-06 08:01:22

标签: php laravel jwt lumen

我是Lumen的新手,我正在尝试使用令牌构建身份验证过程。 为此,我使用了最新的laravel / lumen dist(6.x)和最新的firebase-token dist(5.x)。

在教程的帮助下,我已经将某种程度上可行的身份验证组合在一起。 通过http请求,我可以将用户注册到我的数据库中,然后登录,并通过登录接收令牌,然后可以使用该令牌访问仅包含有效令牌的请求可用的功能。

但是,我对所使用的代码了解甚少。 例如,关于位于app / Providers / AuthServiceProvider.php

中的这段代码
<?php

namespace App\Providers;

use App\User;
use Firebase\JWT\JWT;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Boot the authentication services for the application.
     *
     * @return void
     */
     public function boot()
     {
       // Here you may define how you wish users to be authenticated for your Lumen
       // application. The callback which receives the incoming request instance
       // should return either a User instance or null. You're free to obtain
       // the User instance via an API token or any other method necessary.

       $this->app['auth']->viaRequest('api', function ($request) {
         $key = 'pawifjopawiejfpoaiwejfpoji';
         $jwt = preg_replace('/^Bearer (.*)/', '$1', $request->header('Authorization'));
         $decoded = JWT::decode($jwt, $key, ['HS256']);

         return User::where('email', $decoded->email)->first();
       });
     }
}

我对$ key不太了解。 我已经研究了集成到此源代码中的类,并且发现在JWT类中,$ key用于解码和编码JWT。

但是,这个$ key是从哪里来的呢?在我的代码中,它只是硬编码到boot()函数中,但这是通常的方法吗?我也不知道它是如何生成的,是否遵循任何规则,例如字符数或字符类型?

最后我也不知道这个boot()函数是如何工作的。它需要一个请求,但是什么时候真正发生? 在我的控制器中,没有调用过boot()的函数:

AuthController.php:

<?php
/**
 * Created by PhpStorm.
 * User: andre
 * Date: 15.02.2017
 * Time: 20:56
 */

namespace App\Http\Controllers;

use App\User;
use Firebase\JWT\JWT;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class AuthController extends Controller
{
  public function signup(Request $request)
  {
    $newUser = new User([
      'name' => $request->name ?? '',
      'email' => $request->email ?? 'user@example.com'
    ]);
    $newUser->password = password_hash($request->password, PASSWORD_BCRYPT);
    $newUser->save();
    return new Response('ok', 200, ['Content-Type' => 'text/plain']);
  }

  public function login(Request $request)
  {
    $user = User::where('email', $request->email)->first();

    if (!is_null($user)) {
      if (password_verify($request->password, $user->password)) {
        $key = 'pawifjopawiejfpoaiwejfpoji';
        $token = [
          'iss' => 'http://jwt-test.dev.local',
          'name' => $user->name,
          'email' => $user->email,
          'admin' => $user->id === 2
        ];

        $jwt = JWT::encode($token, $key);

        return new Response($jwt, 200, ['Content-Type' => 'text/plain']);
      }
      return 'wrong password';
    }
    return 'user not found';
  }
}

SecretController.php:

<?php

namespace App\Http\Controllers;

//use Illuminate\Http\Request;


use App\User;
use Firebase\JWT\JWT;
use Illuminate\Http\Request;
use Illuminate\Http\Response;


class SecretController extends Controller
{
  public function index(Request $request)
  {
    return new Response('Hello ' . $request->user()->name,
      200, ['Content-Type', 'text/plain']);
  }

  public function pub()
  {
    return new Response('Hello World', 200, ['Content-Type', 'text/plain']);

  }
}

尽管确实需要一个请求,所以我猜想它必须在客户端->服务器http请求的过程中发挥一定的作用。也许您可以启发我AuthServiceProvider.php在httpRequest期间的什么时候起作用。是在管制员采取行动之前还是之后?

0 个答案:

没有答案