📅  最后修改于: 2023-12-03 15:02:35.141000             🧑  作者: Mango
在使用 Laravel 构建应用程序时,您可能需要验证用户并生成相应的令牌。JSON Web Token(JWT)是一种有效且安全的身份验证和数据交换方法。该标准(RFC 7519)定义了一种紧凑且可自解释的方式,用于在各方之间以 JSON 格式安全地传输信息。
在本文中,我们将介绍如何在 Laravel 应用程序中使用 JWT 生成令牌,并且使用 SQL Server 作为存储用户信息的数据库。
要在 Laravel 应用程序中使用 JWT,您需要安装 Laravel JWT 扩展包。执行以下命令以安装扩展包:
composer require tymon/jwt-auth
安装完成后,您需要在 Laravel 中生成 JWT 的密钥。使用以下命令生成密钥:
php artisan jwt:secret
现在,您已经准备好在 Laravel 应用程序中使用 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 () {
//
});
接下来,我们将介绍如何在 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: 请参考上文中提到的示例代码