您的位置:

Laravel JWT Token验证的最佳实践方法

一、JWT Token介绍

JSON Web Token(JWT)是一种用于身份验证的开放标准,它可以在用户和服务器之间安全地传递信息。在JWT中,用户的信息被加密,并且可以被验证和信任,从而提高了Web应用程序的安全性。

JWT由三部分组成,头部,负载和签名。头部指定了令牌类型为JWT,以及签名算法,如HMAC-SHA256或RSA。负载包含用户信息,这些信息被称作声明(claim),声明又被分为标准声明、公共声明和私有声明。标准声明包括JWT例子中的iss(issuer)、exp(expiration time)、sub(subject)等,都是这些JWT实体信息的保留关键字;公共声明包括必要的但不是唯一的信息,比如:所有的声明都是可选的,也可以自己定义声明名称和值;私有声明是提供者和消费者所共同定义的声明,用于预防名称冲突

签名是将头部、负载和密钥进行hash操作来生成的,用于防止JWT在传递过程中被篡改。密钥只有服务器端知道,因此只有服务器端能够生成有效的JWT签名。

二、Laravel与JWT Token集成

Laravel作为全球最有影响力的PHP框架,已经内置了对JWT的支持。可以使用Tymon\JWTAuth包来添加JWT身份验证到Laravel应用程序中。

首先要从composer安装Tymon\JWTAuth包,使用下面的命令行:


composer require tymon/jwt-auth

然后配置JWT密钥,可以使用Artisan命令生成一个默认的密钥。运行下面的命令:


php artisan jwt:secret

以上命令将在您的.env文件中添加JWT_SECRET密钥。

三、JWT Token身份验证

在Laravel中,身份验证通常是通过保护的路由来完成的。在JWT中,您可以使用守卫和中间件来保护路由。JWT默认提供了一种JWTGuard来处理JWT身份验证,还提供了一种JWTAuthenticateMiddleware来处理身份验证。

四、实现JWT Token身份验证的步骤

1、创建用户模型

首先,我们需要创建一个用户模型,您可以使用Laravel自带的命令来创建:


php artisan make:model User 

接下来,我们需要在users数据表中添加字段,来存储用户信息。


Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->timestamps();
});

2、创建API控制器

接下来,我们需要为API创建一个控制器,用于处理所有的API请求:


php artisan make:controller ApiController 

在控制器中,我们需要实现register、login、logout和refresh方法,其实现如下所示:


namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\User;
use JWTAuth;
use JWTAuthException;

class ApiController extends Controller
{
    public function register(Request $request)
    {
        $user = User::create([
            'name' => $request->input('name'),
            'email' => $request->input('email'),
            'password' => bcrypt($request->input('password'))
        ]);
        $token = JWTAuth::fromUser($user);
        return response()->json(compact('token'));
    }

    public function login(Request $request)
    {
        $input = $request->only('email', 'password');
        $jwt_token = null;
        $user = User::where('email', $input['email'])->first();
        $credentials = [
            'email' => $input['email'],
            'password' => $input['password'],
        ];
        try {
            if (!$jwt_token = JWTAuth::attempt($credentials)) {
                return response()->json([
                    'msg' => 'Invalid Email or Password',
                ], 401);
            }
        } catch (JWTAuthException $e) {
            return response()->json([
                'msg' => 'Failed to create token',
            ], 500);
        }
        return response()->json(['token' => $jwt_token]);
    }

    public function logout(Request $request)
    {
        try {
            JWTAuth::invalidate(JWTAuth::getToken());
            return response()->json([
                'msg' => 'You have successfully logged out'
            ]);
        } catch (JWTException $exception) {
            return response()->json([
                'msg' => 'Failed to logout, please try again'
            ], 500);
        }
    }

    public function refresh()
    {
        $token = JWTAuth::getToken();
        $new_token = JWTAuth::refresh($token);
        return response()->json([
            'token' => $new_token
        ]);
    }
}

3、配置路由

接下来,我们需要为这些API定义路由,您可以在路由文件中添加下面的代码来创建路由:


Route::group(['prefix' => 'api'], function () {
    Route::post('register', 'Api\ApiController@register');
    Route::post('login', 'Api\ApiController@login');
    Route::post('logout', 'Api\ApiController@logout');
    Route::post('refresh', 'Api\ApiController@refresh');
});

4、测试您的API

在完成上述步骤后,您现在可以测试您的API,通过POST请求向/register、/login、/logout和/refresh这些端点传递数据来测试您的API。

五、总结

JWT是一种帮助在Web应用程序中提供安全身份验证的标准,在Laravel中,使用JWT可以让我们更加方便地实现身份验证,同时也可以满足我们的安全需要。本文介绍了JWT的基本概念、Laravel中与JWT集成的步骤以及如何实现JWT身份验证,希望能够对您在使用Laravel开发Web应用程序中提供帮助。