Lumen 使用 Jwt 过程记录

2个月前 0 0 113

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

下载 Jwt 包

修改 composer.json

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

composer update

配置

修改 bootstrap 目录下 app.php 文件

 $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 服务

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 复制过来。配置如下

return [

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

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

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

    'passwords' => [
        //
    ],

];

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

php artisan jwt:secret

使用

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

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,实现如下:

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'));
    }
}

添加路由

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

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

{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODAwMFwvbG9naW4iLCJpYXQiOjE1NDI2ODExMzgsImV4cCI6MTU0MjY4NDczOCwibmJmIjoxNTQyNjgxMTM4LCJqdGkiOiJHZGp5bFV1ZlpHdzM2cTlPIiwic3ViIjo4LCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.oZwsvsY8kfDvcs6ct_IGLzU8JWPDUbTTb6u8OTntsl4"
}

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

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

评论 (0)

    暂无评论~

njphper@copyright From 2014 to 2019-02-17