我是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期间的什么时候起作用。是在管制员采取行动之前还是之后?