📅  最后修改于: 2023-12-03 15:17:11.922000             🧑  作者: Mango
在基于 Web 的应用程序中,用户通常需要进行身份验证才能执行某个操作。JSON Web Token(JWT)是一种流行的身份验证方法,它可以允许用户使用令牌进行身份验证,而无需在每个请求中都提供凭据。
在本文中,我们将学习如何使用 Laravel 8 和 JWT 实现 API 身份验证。
在使用 Laravel 8 和 JWT 之前,您需要确保已安装 Laravel 和 Composer。如果您还没有安装 Laravel,请按照下面的步骤进行:
composer global require laravel/installer
laravel new my-app
现在,我们已经准备好开始使用 Laravel 8 和 JWT 的身份验证功能。
首先,我们需要在 Laravel 8 项目中安装 JWT 包。您可以通过 Composer 使用下面的命令安装 tymon/jwt-auth
包:
composer require tymon/jwt-auth
安装 JWT
后,我们需要在 Laravel 8 中配置 JWT
。打开 config/app.php
配置文件,找到 providers
数组,并添加以下行:
/*
* Package Service Providers...
*/
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
在同一配置文件中,找到 aliases
数组并将以下行添加到结尾:
/*
* Aliased Class Names...
*/
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
现在我们已经成功配置了 JWT,我们可以使用它来验证身份。
接下来,我们需要为我们的 API 创建认证路由,以便用户可以使用它来登录并获取他们的 JWT 令牌。打开 routes/api.php
文件,并添加以下路由:
Route::post('login', 'App\Http\Controllers\AuthController@login');
现在我们需要创建一个控制器来处理用户的登录请求。使用以下 Artisan 命令创建 AuthController:
php artisan make:controller AuthController
打开 AuthController
并添加以下方法:
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
class AuthController extends Controller
{
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
try {
if (!$token = JWTAuth::attempt($credentials)) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
return response()->json(['error' => 'could_not_create_token'], 500);
}
return response()->json(compact('token'));
}
}
首先,我们使用 $request->only()
方法获取用户通过 POST 形式提交的 email
和 password
值。然后,我们使用 JWTAuth::attempt()
方法尝试通过这些凭据获取用户的 JWT 令牌。如果令牌无法获得,则返回 HTTP 无效的凭据响应。
如果令牌成功获得,则返回令牌作为 JSON 数据。我们将使用这个 JWT 令牌来验证用户的身份。
我们需要修改 User Model 以增加对 JWT 的支持。打开 app/Models/User.php
文件,添加以下引用:
use Tymon\JWTAuth\Contracts\JWTSubject;
接着,让 User
模型扩展此 JWTSubject
接口。
class User extends Authenticatable implements JWTSubject
{
现在让我们创建必要的方法,接口的两个方法 getJWTIdentifier
和 getJWTCustomClaims
。
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return [];
}
完成后,User
模型应类似于以下内容:
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
use HasFactory, Notifiable;
/**
* 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 [];
}
}
现在我们已经安装、配置和实现了 JWT 身份验证,让我们测试一下它是否正常工作。打开 Postman 或 CURL 并向 URL 发送带有 JSON 消息正文的 POST 请求:
http://localhost:8000/api/login
用户名和密码的值应该与您的数据库中的用户数据相匹配:
{
"email": "example@example.com",
"password": "password"
}
如果验证通过,您应该会收到一个 JSON 响应,其中包含标记:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
有了这个 JWT 令牌,您可以访问那些需要身份验证的路由。
Laravel 8 使用 JWT 的身份验证是一种快速、安全和可靠的身份验证方法。我们希望这篇简短的介绍能帮助您开始使用 Laravel 和 JWT 身份验证来保护您的 API。
您可以访问 官方文档 了解更多信息和功能。