Laravel - 保护 API 路由

Posted

技术标签:

【中文标题】Laravel - 保护 API 路由【英文标题】:Laravel - Protect API routes 【发布时间】:2019-09-13 00:17:11 【问题描述】:

我有以 VUEJS 作为前端的 Laravel 应用程序, 我通过创建 API 路由来获取数据。 例如获取帖子数据的路径是http://localhost/api/posts

保护我的路线的最佳方法是什么?

我在 laravel 文档中看到有: API认证https://laravel.com/docs/5.8/api-authentication 还有护照https://laravel.com/docs/5.8/passport

例如现在任何用户都可以到达路由http://localhost/api/posts 他会得到包含所有帖子数据的json。

我想保护它并只允许来自我的 VUEJS 组件的内部 api 请求来获取数据

【问题讨论】:

【参考方案1】:

我假设您将使用 Laravel auth 路由进行身份验证,并且在身份验证之后,您到达的下一个视图是包含所有 Vue 组件的视图。

解决方法很简单,即使是documentation,也应该明确必要的步骤。

我们需要:

    添加护照composer require laravel/passport 进行迁移php artisan migrate 安装护照php artisan passport:install

第四步比较复杂。我们需要打开我们的 User.php 模型文件。首先我们需要导入 HasApiTokens 并告诉模型使用它。

use Laravel\Passport\HasApiTokens;

class User extends Authenticatable



    use HasApiTokens, Notifiable;

    .......


然后在我们的config/auth.php上我们需要修改api数组,把驱动改成passport

'api' => [

    //for API authentication with Passport

    'driver' => 'passport',

    'provider' => 'users',

],

然后在我们的app/Http/Kernel.php 上,我们需要在键web 中的$middlewareGroups 数组中添加一个中间件。

protected $middlewareGroups = [

    'web' => [

        ................

        //for API authentication with Passport

        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,

    ],

现在我们可以在我们的 api 路由上使用 auth:api 中间件。

Route::middleware('auth:api')->group( function()
    ...your routes here
);

【讨论】:

【参考方案2】:

这就是 CSRF TOKEN 做的,和 API Authorization 做的不太一样

CSRF 令牌

要保护(内部)API 或访问点免受跨站点访问,请参阅Cross-site_request_forgery

CSRF Token过期并随机生成,会导致程序访问困难

API 授权

该 API 旨在供其他程序使用,您希望保护它们免受未经授权的访问

由于 API 令牌的到期和生成由管理员手动处理,因此您需要将此 API 令牌放在 html 中以使您的功能正常工作,所以这不是您在此处搜索的内容


更多关于 Laravel 中 CSRF 保护的细节见:Laravel CSRF production document

一般情况下,我们会默认保护所有的 POST 和 PUT 路由

【讨论】:

以上是关于Laravel - 保护 API 路由的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 无法保护 API 路由

如何保护 laravel api 路由免受外部 GET 请求的影响

Laravel Passport - 保护不同用户类型的路由

如何使用 Laravel Passport 组织这样的路由保护?

Laravel CSRF 保护与 REST API

Laravel 的路由