Lumen 使用 Jwt 过程记录

最近想搞一下前后端分离,所以就基于 Vue 想做一下基础的后台管理,后端就选用了 Lumen5.7.*,因为解决方案多,方便。认证就在此基础使用了 Json Web Token(JWT)。这里记录一些使用过程。

下载 Jwt 包

修改 composer.json

1
2
3
"require": {
"tymon/jwt-auth": "1.0.*"
},

composer update

配置

修改 bootstrap 目录下 app.php 文件

1
2
3
4
5
6
7
8
9
 $app->withFacades();

$app->withEloquent();

$app->routeMiddleware([
'auth' => App\Http\Middleware\Authenticate::class,
]);
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);

打开这五行注释。然后进入到 AppServiceProvider 服务注入文件, 注册 Jwt 服务

1
2
3
4
5
public function register()
{
// Register Jwt Service
$this->app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);
}

其次需要增加 Jwt Auth 认证配置。所以在根目录下增加配置文件目录 config,然后增加 auth.php 配置文件,内容从 laravel\lumen-framework\config\auth.php 复制过来。配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
return [

'defaults' => [
'guard' => env('AUTH_GUARD', 'api'),
],

'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],

'providers' => [
//
'users' => [
'driver' => 'eloquent',
'model' => \App\User::class,
],

'passwords' => [
//
],
];

除了这里,还需要看一下包提供的配置。然后创建一个 jwt.php 配置文件就可以了。 最后执行一下命令,生成秘钥

1
php artisan jwt:secret

使用

门面的服务驱动使用的 eloquent, 所以需要实现 Tymon\JWTAuth\Contracts\JWTSubject 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{
use Authenticatable, Authorizable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email',
];

/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = [
'password',
];

/**
* Get the identifier that will be stored in the subject claim of the JWT.
*
* @return mixed
*/
public function getJWTIdentifier()
{
return $this->getKey();
}

/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
}

创建一个控制器 LoginController,实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Illuminate\Http\Request;
use Tymon\JWTAuth\JWTAuth;

class LoginController extends Controller
{
public function login(Request $request, JWTAuth $jwt)
{
if (! $token = $jwt->attempt($request->only('email', 'password'))) {
return response()->json(['user_not_found'], 404);
}

return response()->json(compact('token'));
}
}

添加路由

1
$router->post('login', 'LoginController@login');

这个要说一下,你的 Users 表结构可以直接用 Laravel Auth,认证实际也是基于 Auth 实现的,所以这一块很轻松。 测试用 Postman 请求一下,可以看到返回的结果。应该是这样的。

1
2
3
{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODAwMFwvbG9naW4iLCJpYXQiOjE1NDI2ODExMzgsImV4cCI6MTU0MjY4NDczOCwibmJmIjoxNTQyNjgxMTM4LCJqdGkiOiJHZGp5bFV1ZlpHdzM2cTlPIiwic3ViIjo4LCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.oZwsvsY8kfDvcs6ct_IGLzU8JWPDUbTTb6u8OTntsl4"
}

上述便是该包使用的过程,如果有疑问或者遗漏之处请指正。Jwt 文档地址