📜  laravel jwt 生成令牌 - SQL (1)

📅  最后修改于: 2023-12-03 15:02:35.141000             🧑  作者: Mango

Laravel JWT 生成令牌 - SQL

在使用 Laravel 构建应用程序时,您可能需要验证用户并生成相应的令牌。JSON Web Token(JWT)是一种有效且安全的身份验证和数据交换方法。该标准(RFC 7519)定义了一种紧凑且可自解释的方式,用于在各方之间以 JSON 格式安全地传输信息。

在本文中,我们将介绍如何在 Laravel 应用程序中使用 JWT 生成令牌,并且使用 SQL Server 作为存储用户信息的数据库。

安装 JWT

要在 Laravel 应用程序中使用 JWT,您需要安装 Laravel JWT 扩展包。执行以下命令以安装扩展包:

composer require tymon/jwt-auth

安装完成后,您需要在 Laravel 中生成 JWT 的密钥。使用以下命令生成密钥:

php artisan jwt:secret

现在,您已经准备好在 Laravel 应用程序中使用 JWT。

JWT 身份验证

下面我们将为您介绍如何使用 JWT 进行身份验证。

首先,您需要在 Laravel 中设置 JWT。在 config/auth.php 文件中,将默认的 API guard 更改为 jwt guard:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

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

现在,您需要在 AppServiceProvider.php 文件中注册自己的用户认证逻辑。以下是一个例子:

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\ServiceProvider;
use Tymon\JWTAuth\Http\Middleware\Authenticate;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        Auth::provider('sqlserver', function ($app, array $config) {
            return new SqlServerUserProvider($app['hash'], $config['model']);
        });
    }

    public function boot()
    {
        Auth::viaRequest('jwt', function ($request) {
            return Auth::guard('api')->setRequest($request)->user();
        });

        $this->app['auth']->extend('jwt', function ($app, $name, array $config) {
            return new JwtGuard(Auth::createUserProvider($config['provider']), $app->make(Authenticate::class), $app['request']);
        });
    }
}

在此示例中,创建了一个名为 sqlserver 的“用户提供者”对象,以及一个名为 jwt 的“用户保护对象”。

您还需要创建一个名为 JwtGuard 的自定义 Guard 类。以下是它的基本结构:

use Illuminate\Auth\GuardHelpers;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Contracts\Providers\Auth as JWTAuth;

class JwtGuard implements Guard
{
    use GuardHelpers;

    protected $jwt;
    protected $request;

    public function __construct(UserProvider $provider, Request $request, JWTAuth $jwt)
    {
        $this->provider = $provider;
        $this->request = $request;
        $this->jwt = $jwt;
    }

    // 实现 Guard 接口的方法
}

此处省略了具体的实现代码。

现在,您已经可以使用 JWT 进行身份验证了。对于需要验证身份的路由,您可以使用 Laravel 的 auth 中间件,并将 guard 设置为 jwt:

Route::group(['middleware' => ['auth:jwt']], function () {
    //
});
生成 JWT

接下来,我们将介绍如何在 Laravel 中生成 JWT。

您可以在 UserController.php 文件中添加一个 login() 方法,用于在用户登录成功时生成 JWT。以下是一个例子:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use stdClass;

class UserController extends Controller
{
    public function login(Request $request)
    {
        $credentials = $request->only('username', 'password');
        $token = Auth::guard('api')->attempt($credentials);

        if (!$token) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        $user = Auth::guard('api')->user();

        if (!$user) {
            return response()->json(['error' => 'User not found'], 404);
        }

        $data = new stdClass();
        $data->token = $token;
        $data->user = $user;

        return response()->json(['data' => $data], 200);
    }
}

此例中,您将在用户登录成功时生成 JWT,并返回给客户端。在生成 JWT 之前,您需要先使用 guard 以及 $credentials 变量验证用户身份。

总结

以上为在 Laravel 应用程序中使用 JWT 身份验证的过程示例。这是一种安全且可靠的数据交换方法,以及一种验证用户身份的标准方法。

在使用 JWT 进行身份验证时,建议将其设置为 Laravel 中的默认身份验证方式,并确保生成的 JWT 使用的是安全密钥。

代码片段如下:

// TODO: 请参考上文中提到的示例代码