نسخه:

API Authentication

معرفی

به طور پیش فرض، لاراول با یک راه حل ساده برای احراز هویت API از طریق یک توکن تصادفی اختصاص داده شده به هر کاربر از برنامه شما ارسال می شود. در config/auth.php فایل پیکربندی شما ، یک api محافظ از قبل تعریف شده است و از یک token درایور استفاده می کند. این درایور مسئول بازرسی توکن API در درخواست ورودی و بررسی مطابقت آن با توکن اختصاص داده شده کاربر در پایگاه داده است.

توجه: در حالی که لاراول با یک محافظ ساده و مبتنی بر توکن عرضه می شود، ما قویاً توصیه می کنیم از Laravel Passport برای برنامه های قوی و تولیدی استفاده کنید که احراز هویت API را ارائه می دهند.

پیکربندی

آماده سازی پایگاه داده

قبل از استفاده از token درایور، باید یک مهاجرت ایجاد کنید که یک api_token ستون به users جدول شما اضافه می کند:

Schema::table('users', function ($table) {
$table->string('api_token', 80)->after('password')
->unique()
->nullable()
->default(null);
});

پس از ایجاد مهاجرت، migrate دستور Artisan را اجرا کنید.

اگر انتخاب می کنید از نام ستون دیگری استفاده کنید، حتماً storage_key گزینه پیکربندی API خود را در config/auth.php فایل پیکربندی به روز کنید.

تولید توکن

هنگامی که api_token ستون به جدول شما اضافه شد users ، شما آماده هستید تا به هر کاربری که در برنامه شما ثبت نام می کند، نشانه های API تصادفی اختصاص دهید. زمانی که یک User مدل برای کاربر در حین ثبت نام ایجاد می شود، باید این نشانه ها را اختصاص دهید . هنگام استفاده از داربست احراز هویت ارائه شده توسط بسته Composer، این ممکن است به روش زیر laravel/ui انجام شود : create RegisterController

use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
 
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::forceCreate([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'api_token' => Str::random(80),
]);
}

هش کردن توکن ها

در مثال های بالا، توکن های API در پایگاه داده شما به صورت متن ساده ذخیره می شوند. اگر می‌خواهید توکن‌های API خود را با استفاده از هش SHA-256 هش کنید، می‌توانید گزینه پیکربندی محافظ hash خود را روی . گارد در فایل پیکربندی شما تعریف شده است : api true api config/auth.php

'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => true,
],

تولید توکن های هش شده

هنگام استفاده از نشانه های API هش شده، نباید توکن های API خود را در طول ثبت نام کاربر ایجاد کنید. در عوض، باید صفحه مدیریت توکن API خود را در برنامه خود پیاده سازی کنید. این صفحه باید به کاربران اجازه دهد تا توکن API خود را مقداردهی اولیه و بازخوانی کنند. هنگامی که کاربر درخواستی برای مقداردهی اولیه یا تازه کردن توکن خود می کند، باید یک کپی هش شده از توکن را در پایگاه داده ذخیره کنید و کپی متن ساده توکن را برای نمایش یک بار به مشتری view / frontend برگردانید.

به عنوان مثال، یک متد کنترل‌کننده که توکن را برای یک کاربر خاص مقداردهی اولیه یا تازه می‌کند و نشانه متن ساده را به عنوان پاسخ JSON برمی‌گرداند، ممکن است به شکل زیر باشد:

<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Support\Str;
 
class ApiTokenController extends Controller
{
/**
* Update the authenticated user's API token.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function update(Request $request)
{
$token = Str::random(80);
 
$request->user()->forceFill([
'api_token' => hash('sha256', $token),
])->save();
 
return ['token' => $token];
}
}

از آنجایی که توکن های API در مثال بالا دارای آنتروپی کافی هستند، ایجاد "جدول رنگین کمان" برای جستجوی مقدار اصلی توکن هش شده غیرعملی است. بنابراین، روش های هش آهسته مانند bcrypt غیر ضروری هستند.

حفاظت از مسیرها

لاراول شامل یک محافظ احراز هویت است که به طور خودکار توکن های API را در درخواست های دریافتی تأیید می کند. شما فقط باید auth:api میان افزار را در هر مسیری که به یک نشانه دسترسی معتبر نیاز دارد، مشخص کنید:

use Illuminate\Http\Request;
 
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});

عبور توکن ها در درخواست ها

راه های مختلفی برای انتقال توکن API به برنامه شما وجود دارد. ما در مورد هر یک از این رویکردها در حین استفاده از کتابخانه HTTP Guzzle برای نشان دادن استفاده از آنها بحث خواهیم کرد. شما می توانید هر یک از این رویکردها را بر اساس نیازهای برنامه خود انتخاب کنید.

رشته پرس و جو

مصرف کنندگان API برنامه شما ممکن است توکن خود را به عنوان یک api_token مقدار رشته کوئری مشخص کنند:

$response = $client->request('GET', '/api/user?api_token='.$token);

بارگذاری را درخواست کنید

مصرف کنندگان API برنامه شما ممکن است نشانه API خود را در پارامترهای فرم درخواست به صورت api_token :

$response = $client->request('POST', '/api/user', [
'headers' => [
'Accept' => 'application/json',
],
'form_params' => [
'api_token' => $token,
],
]);

توکن حامل

مصرف کنندگان API برنامه شما ممکن است نشانه API خود را به عنوان یک Bearer توکن در Authorization هدر درخواست ارائه دهند:

$response = $client->request('POST', '/api/user', [
'headers' => [
'Authorization' => 'Bearer '.$token,
'Accept' => 'application/json',
],
]);