要保护一个Laravel REST API,使客户端能够代表自己进行操作,你可以采用OAuth 2.0的授权机制。以下是一个使用Laravel Passport库来实现的示例:
composer require laravel/passport
php artisan migrate
php artisan passport:keys
AuthServiceProvider
的boot
方法中注册Passport的路由和服务提供者,在app/Providers/AuthServiceProvider.php
中添加以下代码:use Laravel\Passport\Passport;
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
User
模型类中,使用Laravel\Passport\HasApiTokens
trait,并在boot
方法中调用Passport::tokens()
方法,如下所示:use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
// ...
public static function boot()
{
parent::boot();
Passport::tokensCan([
'place-order' => 'Place an order',
'view-profile' => 'View user profile',
// 添加其他可用的权限
]);
}
}
php artisan passport:client --password
将会生成一个Client ID和Client Secret,请妥善保存。
config/auth.php
配置文件中将默认的驱动改为passport
:'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
// ...
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
auth:api
中间件来保护,例如:Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
$http = new GuzzleHttp\Client;
$response = $http->post('http://your-app.com/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => 'client-id',
'client_secret' => 'client-secret',
'username' => 'user@example.com',
'password' => 'password',
'scope' => '', // 如果有特定的权限要求,可以在这里指定
],
]);
$access_token = json_decode((string) $response->getBody(), true)['access_token'];
$http = new GuzzleHttp\Client;
$response = $http->request('GET', 'http://your-app.com/api/user', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
],
]);
$api_response = json_decode((string) $response->getBody(), true);
// 处理API响应
这样,你就可以保护你的Laravel REST API,并允许客户端代表自己进行操作了。请根据你的实际需求进行相应的调整和扩展。