atarek/jwt

基于laravel框架的Jwt token身份验证

dev-master 2019-09-05 15:48 UTC

This package is auto-updated.

Last update: 2024-09-06 10:23:45 UTC


README

此包用于处理laravel项目中基于令牌的身份验证。它使用两种类型的令牌:访问令牌和刷新令牌。当用户成功认证时,都会生成这两种令牌。它还支持多表认证。

此包仅支持EloquentUserProvider,其他提供者将无法工作

安装

您可以通过composer安装它

composer require atarek\jwt

然后,将JwtServiceProvider添加到app.php中的提供者列表中

'providers' => [
        // ...
        Atarek\Jwt\Providers\JwtServiceProvider::class,
        //...
],

接下来,运行以下命令以发布包

php artisan vendor:publish --provider="Atarek\Jwt\Providers\JwtServiceProvider"

用法

将auth.php守卫驱动程序配置为jwt

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

provider_name必须与auth.php中的提供者名称匹配

<?php
return [
    'routes' => [
        'prefix' => [
            // provider_name => url_prefix
            // 'users' => 'api/users/actions',
        ],
        'controller' => [
            // provider_name => controller_name
            // 'users' => \Atarek\Jwt\Controllers\AuthController::class,
        ],
    ],

    'encode_secret' => false,

    'access' => [
        'expiration_time' => '+1 hour',
        'env_secret' => env('ACCESS_TOKEN_SECRET'),

    ],

    'refresh' => [
        'expiration_time' => '+1 day',
        'env_secret' => env('REFRESH_TOKEN_SECRET')
    ]
];

在您的laravel .env文件中添加以下两个密钥

ACCESS_TOKEN_SECRET=xxxx
REFRESH_TOKEN_SECRET=yyyy

您必须在您的Authenticatable模型上实现TokenSubject合约

<?php

namespace App;

use Atarek\Jwt\Core\Contracts\TokenSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements TokenSubject
{
    public function addClaims($tokenType):array
    {
        /* 
         * where you add additional custom claims to the token
         * $tokenType passed is either access or refresh if
         * custom creation needed is based on tokenType
         */ 
        return [];
    }

    public function getProvider():string
    {
        // must match the auth.php provider
        return 'users';
    }

    public function getIdentifier():string
    {
        // user id 
        return $this->getAuthIdentifier();
    }
}

默认的Atarek\Jwt\Controllers\AuthController::class包含四个处理令牌身份验证和路由的方法。

route_prefix/auth, @authenticate验证请求凭证并返回访问令牌和刷新令牌。

route_prefix/me, @user返回从授权令牌获取的当前用户。

route_prefix/revoke, @revoke将授权令牌加入黑名单。

reoute_prefix/refresh, @refresh返回新的访问令牌,您只能使用刷新令牌进行刷新。

中间件

has.access中间件添加到验证传入请求中

Route::get('do-something','ThingsController@doSomthing')->middleware('has.access');

用户

然后可以从Auth Facade访问用户$user = Auth::user();

扩展AuthController

您可以通过扩展默认的 Atarek\Jwt\Controllers\AuthController::class并添加返回响应之前的额外逻辑来扩展它

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Atarek\Jwt\Controllers\AuthController;

class UserController extends AuthController
{
    public function authenticate(Request $request, $callBack = null)
    {
        return parent($request, function($accessToken, $refreshToken){
            // do stuff here 
            // Auth::user()->doStuff();
            return response()->json([
                'access'=>$accessToken,
                'refresh'=>$refreshToken
            ]);
        });
    }    
}

贡献

欢迎拉取请求。对于主要更改,请首先创建一个问题来讨论您想要更改的内容。

请确保适当更新测试。

许可

MIT