📜  laravel 8 jwt api 认证 - PHP (1)

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

Laravel 8 JWT API 认证 - PHP

简介

在基于 Web 的应用程序中,用户通常需要进行身份验证才能执行某个操作。JSON Web Token(JWT)是一种流行的身份验证方法,它可以允许用户使用令牌进行身份验证,而无需在每个请求中都提供凭据。

在本文中,我们将学习如何使用 Laravel 8 和 JWT 实现 API 身份验证。

安装 Laravel

在使用 Laravel 8 和 JWT 之前,您需要确保已安装 Laravel 和 Composer。如果您还没有安装 Laravel,请按照下面的步骤进行:

  1. 下载安装器:
composer global require laravel/installer
  1. 创建新的 Laravel 应用程序。
laravel new my-app

现在,我们已经准备好开始使用 Laravel 8 和 JWT 的身份验证功能。

安装 JWT

首先,我们需要在 Laravel 8 项目中安装 JWT 包。您可以通过 Composer 使用下面的命令安装 tymon/jwt-auth 包:

composer require tymon/jwt-auth
配置 JWT

安装 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 形式提交的 emailpassword 值。然后,我们使用 JWTAuth::attempt() 方法尝试通过这些凭据获取用户的 JWT 令牌。如果令牌无法获得,则返回 HTTP 无效的凭据响应。

如果令牌成功获得,则返回令牌作为 JSON 数据。我们将使用这个 JWT 令牌来验证用户的身份。

修改 User Model

我们需要修改 User Model 以增加对 JWT 的支持。打开 app/Models/User.php 文件,添加以下引用:

use Tymon\JWTAuth\Contracts\JWTSubject;

接着,让 User 模型扩展此 JWTSubject 接口。

class User extends Authenticatable implements JWTSubject
{

现在让我们创建必要的方法,接口的两个方法 getJWTIdentifiergetJWTCustomClaims

    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。

您可以访问 官方文档 了解更多信息和功能。