如何使用 Laravel Passport 在 Laravel 8 和 7 中创建安全的 CRUD RESTful API
大家好,今天我们将严格在后端编码,我们将把我们的Laravel 8 CRUD应用程序转换为 RESTful API。API 是一个软件中介,允许两个应用程序相互通信。有时您可能需要创建一个可以在不同语言或框架上运行的应用程序,例如,您可以使用 Laravel 为您的应用程序创建后端,而前端可以在任何 JavaScript 框架上运行。API 允许两个或多个程序相互通信。
有不同类型的 API,但今天我们将专注于RESTful API。REST代表表述性状态转移,而API代表应用程序编程接口。您可以从互联网或其他编程材料中阅读有关 API 的更多信息。
点击我的个人资料关注我以获取更多更新。
通常,当我们构建应用程序时,我们需要保护应用程序的安全,以阻止未经授权的访问。Laravel 已经可以轻松地通过传统的登录表单执行身份验证,但是 API 呢?API 不会在请求之间维护会话状态,因此需要使用令牌来验证应用程序并授权应用程序的使用。Laravel
提供了一个包,使用 Laravel Passport 可以非常轻松地进行 API 身份验证。不过,还有其他选择,这是 Laravel 团队的官方包,它提供了完整的 OAuth2 服务器实现。它易于应用,几分钟内即可完成。话不多说,让我们深入研究一下。
步骤 1:安装 Laravel 8
要安装最新的 Laravel 框架(截至本文发布时为 Laravel 8.0),请运行以下命令
composer create-project --prefer-dist laravel/laravel laravel_8_api_crud
这将自动创建一个 Laravel 8 应用,并且一些设置已完成。我们无需复制并重命名 env.example 文件,Laravel 8 会自动完成这些操作。Laravel 8 的另一个重要功能是,您无需生成 APP_KEY,新版本会自动生成。 完成所有设置后,我们的应用即可使用。
第 2 步:数据库设置
创建一个空数据库,打开 .env 文件,然后更新数据库配置。有关此步骤的更多信息,您可以访问我之前的文章《Laravel 8 CRUD》 ,我在其中详细解释了这些步骤。
步骤3:安装 Laravel Passport
让我们安装 Laravel Passport。Passport 服务提供程序会注册其自己的数据库迁移目录,这意味着它会创建我们需要用来存储客户端的表。该表将用于存储生成的令牌,该令牌将用于识别当前已验证的用户。然后,此令牌将附加到每个请求,允许每个用户访问受保护的路由。
Composer 需要 Laravel/Passport
安装完成后,我们需要进行迁移。但在运行迁移命令之前,我们需要指定默认字符串长度,否则会报错。因此,请前往app/Providers/AppServiceProvider.php 文件,并将以下代码添加到启动函数中。
Schema::defaultstringLength(191);
另外,将其添加到类的顶部
使用 Illuminate\Support\Facades\Schema;
php artisan 迁移
步骤 4:创建加密密钥
我们需要创建生成安全访问令牌所需的加密密钥。
php artisan 护照:安装
此命令还将创建“个人访问”和“密码授予”客户端,用于生成访问令牌。
步骤 5:将 HasApiTokens 特征添加到我们的用户模型
转到App\Models\User.php并告诉 User 类
使用 HasApiTokens,
也将其添加到顶部
使用 Laravel\Passport\HasApiTokens;
步骤 6:在 AuthServiceProvider 中调用护照路由
转到App/Providers/AuthServiceProvider.php并添加
护照::路线();
对于启动方法,同样在顶部的类之前添加路径
使用 Laravel\Passport\Passport;
步骤 7:设置驱动程序
这是 Laravel\Passport 设置和配置的最后一步,我们将把API驱动程序从默认 token 更改为 Passport。
前往config\auth.php 文件并找到guards数组。在 API 密钥中,将驱动程序从 token 更改为 Passport。
步骤 8:为我们的 CRUD api 项目创建迁移文件
php artisan make:模型项目-m
将在数据库/迁移文件夹 中创建一个迁移文件,我们需要创建我们的模式,我添加了名称(字符串)、介绍(字符串)、位置(字符串)、项目成本(整数)。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->string('name', 255);
$table->string('introduction', 500)->nullable();
$table->string('location', 255)->nullable();
$table->integer('cost')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('projects');
}
}
我们需要更新项目模型,使其能够接受字段。我们需要添加一个受保护的 $fillable 方法,该方法将包含应用程序用户可以填写的字段,这有助于防止有人通过输入字段入侵应用程序。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Project extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name',
'location',
'introduction',
'cost',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'cost' => 'int',
];
}
步骤 9:迁移新表
步骤 10:创建资源
构建 API 时,响应始终为 JSON 格式,因此我们需要一个位于 Eloquent 模型和 JSON 响应之间的转换层。这将以 JSON 格式向应用程序用户提供响应。Laravel 为我们提供了一个资源类,用于将模型和模型集合转换为 JSON。因此,我们将创建该资源类
php artisan make:resource 项目资源
这将在应用程序目录中创建一个名为 Resources 的文件夹,并在资源内创建一个ProjectResource.php文件。
步骤11:创建控制器
控制器负责数据流的方向,以及用户与数据库和视图之间的接口。在本例中,由于我们正在处理 API,因此我们现在不与视图交互,因此我们的响应将采用 JSON 格式。RESTful API 的标准是以 JSON 格式发送响应。
我们将创建两个控制器,第一个是身份验证控制器,第二个是项目控制器。我们需要身份验证控制器来生成在项目控制器中使用的令牌。
php artisan make:控制器 API/AuthController
这将在App/Http/Controllers 目录下创建一个名为 API 的文件夹。它还将创建一个名为AuthController.php的新文件。点击AuthController.php并使用以下代码更新它。
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function register(Request $request)
{
$validatedData = $request->validate([
'name' => 'required|max:55',
'email' => 'email|required|unique:users',
'password' => 'required|confirmed'
]);
$validatedData['password'] = Hash::make($request->password);
$user = User::create($validatedData);
$accessToken = $user->createToken('authToken')->accessToken;
return response(['user' => $user, 'access_token' => $accessToken], 201);
}
public function login(Request $request)
{
$loginData = $request->validate([
'email' => 'email|required',
'password' => 'required'
]);
if (!auth()->attempt($loginData)) {
return response(['message' => 'This User does not exist, check your details'], 400);
}
$accessToken = auth()->user()->createToken('authToken')->accessToken;
return response(['user' => auth()->user(), 'access_token' => $accessToken]);
}
}
在我们的 AuthController 中,我们创建了两种方法:注册和逻辑方法
在注册方法中,我们使用 Laravel Validate 方法来确保提供了名称、电子邮件和密码,这也将确保电子邮件没有被盗并且是一个有效的电子邮件地址,在添加用户之前必须确认密码。
验证完成后,我们在创建用户之前使用哈希加密密码,不能存储明文密码。最后,我们获取访问令牌并将其与用户信息一起返回。
在登录方法中,我们还会验证传递的数据,以确保邮箱和密码已提交。如果数据与任何用户不对应,则返回用户不存在的消息;如果对应,则返回用户和访问令牌。
让我们使用--api开关在 API 中创建我们的 ProjectController 。
php artisan make:控制器 API/ProjectController --api --model=Project
--api 开关将创建不包含 create 和 edit 方法的控制器,这些方法将呈现 HTML 模板。
转到App/Http/Controller/API,点击 ProjectController,复制下面的代码并更新方法。
<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\Project;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Http\Resources\ProjectResource;
class ProjectController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$projects = Project::all();
return response([ 'projects' => ProjectResource::collection($projects), 'message' => 'Retrieved successfully'], 200);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$data = $request->all();
$validator = Validator::make($data, [
'name' => 'required|max:255',
'description' => 'required|max:255',
'cost' => 'required'
]);
if ($validator->fails()) {
return response(['error' => $validator->errors(), 'Validation Error']);
}
$project = Project::create($data);
return response(['project' => new ProjectResource($project), 'message' => 'Created successfully'], 201);
}
/**
* Display the specified resource.
*
* @param \App\Models\Project $project
* @return \Illuminate\Http\Response
*/
public function show(Project $project)
{
return response(['project' => new ProjectResource($project), 'message' => 'Retrieved successfully'], 200);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Project $project
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Project $project)
{
$project->update($request->all());
return response(['project' => new ProjectResource($project), 'message' => 'Update successfully'], 200);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\Project $project
* @return \Illuminate\Http\Response
*/
public function destroy(Project $project)
{
$project->delete();
return response(['message' => 'Deleted']);
}
}
- index方法将检索数据库中的所有项目,并显示成功消息(检索成功)并返回状态代码 200。
- store方法会像AuthController一样验证并存储一个新项目,并返回状态码201,也就是“创建成功”的消息。
- show方法将仅检索通过隐式路由模型绑定传递的一个项目,并且如果成功则返回 HTTP 代码 200。
- update方法接收 HTTP 请求和需要编辑的特定项目作为参数。它更新项目并返回相应的响应。
- destroy方法还通过隐式路由模型绑定接收特定项目并将其从数据库中删除。
步骤 12:创建路线
转到 routes 文件夹并单击 api.php,然后使用以下代码进行更新
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\API\AuthController;
use App\Http\Controllers\API\ProjectController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
Route::post('register', [AuthController::class, 'register']);
Route::post('login', [AuthController::class, 'login']);
Route::apiResource('projects', ProjectController::class)->middleware('auth:api');
我们为使用 auth:api 中间件的项目添加了注册路由和登录路由(它们是帖子路由)以及 apiResource 路由。
步骤13:测试
我们将使用 Postman 测试我们的 API,由于复杂性和时间原因,我可能无法在 Postman 上解释所有内容,但请注意此页面上的红色方块注册一个试图获取不存在的用户登录注册用户 为了访问项目路由,我们必须对用户进行身份验证,为了实现这一点,我们必须添加用户的令牌。 复制用户登录时为用户生成的访问令牌,单击Postman 上的授权并选择类型Bearer Token,然后将令牌粘贴到右侧的输入字段中。检索所有项目,但未创建任何项目创建项目检索所有项目仅检索 1 个项目更新项目删除项目
最后,我们来到了文章的结尾,如果你认真地按照文章内容来做,你就不会犯错,但如果你不能完全按照文章内容来做,这是repo的链接
您可以通过点击心形按钮来鼓励我,表达您的爱意,您也可以留下评论、建议等。您也可以通过我的任何联系方式与我联系。
访问我的其他帖子
