Lumen之JWT扩展包

JWT定义及其组成

官网链接:https://jwt.io/

JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSAECDSA的公钥/私钥对进行签名

虽然JWT可以加密以在各方之间提供保密,但我们将专注于签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则隐藏其他方的声明。当使用公钥/私钥对签署令牌时,签名还证明只有持有私钥的一方是签署私钥的一方。

什么时候应该使用JSON Web令牌?

以下是JSON Web令牌有用的一些场景:

  • 授权:这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,允许用户访问该令牌允许的路由,服务和资源。Single Sign On是一种现在广泛使用JWT的功能,因为它的开销很小,并且能够在不同的域中轻松使用。
  • 信息交换:JSON Web令牌是在各方之间安全传输信息的好方法。因为JWT可以签名 - 例如,使用公钥/私钥对 - 您可以确定发件人是他们所说的人。此外,由于使用标头和有效负载计算签名,您还可以验证内容是否未被篡改。

集成JWT到lumen

1.下载lumen

composer create-project laravel/lumen lumen --prefer-dist "5.5.*"

2.安装JWT扩展

composer require tymon/jwt-auth:1.0.0-rc.2

Lumen之JWT扩展包

配置

1.开启 Facade 和 Eloquent

取消以下行的注释。bootstrap/app.php

// $app->withFacades();

// $app->withEloquent();

Lumen之JWT扩展包

2.开启中间件认证

取消以下行的注释。bootstrap/app.php

// $app->routeMiddleware([

// 'auth' => App\Http\Middleware\Authenticate::class,

// ]);

// $app->register(App\Providers\AuthServiceProvider::class);

Lumen之JWT扩展包

3.添加服务提供者

bootstrap/app.php

$app->register(\Tymon\JWTAuth\Providers\LumenServiceProvider::class);

Lumen之JWT扩展包

4.生成加***

# 这条命令会在 .env 文件下生成一个加***,如:JWT_SECRET=foobar

php artisan jwt:secret

Lumen之JWT扩展包

5.更新你的模型

<?php

namespace App;

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;

class User extends Model implements AuthenticatableContract, AuthorizableContract
{
    use Authenticatable, Authorizable;

}

6.注册两个 Facade

bootstrap/app.php

把原先去了注释的那一行再改一下。

$app->withFacades(true, [
        'Tymon\JWTAuth\Facades\JWTAuth' => 'JWTAuth',
        'Tymon\JWTAuth\Facades\JWTFactory' => 'JWTFactory',
    ]
);

7 设置 auth.php

把 \vendor\laravel\lumen-framework\config\auth.php 也复制到 项目根目录config 文件夹(没有就新建)。

'defaults' => [
    'guard' => env('AUTH_GUARD', 'userApi'),
],
'guards' => [
  'userApi' => [
       'driver' => 'jwt',
       'provider' => 'users'
    ],
],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model'  => \App\Model\User::class,
        ],
    ],

8 .注册路由

$router->post('user/login/{code}','User\[email protected]');

9. 创建 token 控制器

<?php
namespace App\Http\Controllers\User;

use App\Exceptions\ThrowException;
use App\Http\Controllers\Controller;
use App\Model\User;
use Illuminate\Http\Request;
use Ixudra\Curl\Facades\Curl;
use Tymon\JWTAuth\JWTAuth;

class LoginController extends Controller
{
    protected $jwt;

    public function __construct(JWTAuth $jwt)
    {
        $this->jwt = $jwt;
    }
    public function userLogin($result)
    {
        $user = User::where('openid',$result)->first();
        $token = $this->jwt->fromUser($user);
        return response()->json(compact('token'),200);
    }
}

注意:

1.在Model中必须要有User模型

(Lumen 还精简了很多辅助函数,比如 auth 和 bcrypt 等。

可以安装 albertcht/lumen-helpers 补全)

2.安装一个composer require albertcht/lumen-helper

 

个人博客:http://oldchen.iwulai.com