【问题标题】:Laravel token authentication security issueLaravel 令牌认证安全问题
【发布时间】:2018-10-01 12:41:04
【问题描述】:

我是 laravel 框架的新手。我想在现有的 laravel 项目中集成一个新的 API。它已经使用警卫实现了基于令牌的身份验证

配置/auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

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

在路由中,我添加了项目的 GET 请求

Route::group(['middleware' => ['auth:api']], function() {

    Route::get('friends', 'UserController@friends')->name('api.user.friends');
}

但现在我可以使用这样的 URL 访问好友列表

http://yourapp.com/api/friends?api_token=STORED_TOKEN_HERE

而不是在标头中传递 api_token。这是安全问题还是 laravel 中使用的方法?

应用中已经有一个以这种方式工作的 GET(logout) URL

【问题讨论】:

  • 如果有人在你身后阅读你的地址栏并且能够记住令牌,它只会比标题更安全。

标签: php laravel


【解决方案1】:

问题是:您希望(或需要)您的应用程序允许在查询参数中传递此访问令牌吗? 我的意思是:它是否必须在 URL 中使用标记(在某些情况下?在所有情况下?或根本不需要?)

一般来说,任何与安全相关的内容都不应该是 URL 的一部分(除非它是单点登录过程的一部分 - 然后几乎没有其他选择,但是令牌的生命周期很短,并且它是单独的主题邮政 ;) )。 因此,如果您希望您的应用遵循最佳实践,请禁用在查询中传递访问令牌并仅从请求标头中检索它,如 described in the Laravel docs

因此,您可能应该查看您的中间件并(我猜)将代码从 Request::input('api_token') 更改为 Request::header('api_token'),因此任何人都无法通过在 URL 中传递 api 令牌进行身份验证。

【讨论】:

  • token 的中间件是作为 laravel 库的一部分实现的吗?
【解决方案2】:

我认为这不是用于 API 身份验证的 Laravel 方法。你应该使用 Laravel 护照,查看令人惊叹的 Laravel 文档https://laravel.com/docs/5.7/passport

Laravel 已经让通过传统登录表单执行身份验证变得很容易,但是 API 呢? API 通常使用令牌对用户进行身份验证,并且不维护请求之间的会话状态。 Laravel 使用 Laravel Passport 使 API 身份验证变得轻而易举,它在几分钟内为您的 Laravel 应用程序提供了完整的 OAuth2 服务器实现。 Passport 建立在由 Andy Millington 和 Simon Hamp 维护的 League OAuth2 服务器之上。

要开始使用,请通过 Composer 包管理器安装 Passport:

composer require laravel/passport

Passport 服务提供者向框架注册了自己的数据库迁移目录,因此您应该在注册提供者后迁移您的数据库。 Passport 迁移将创建您的应用程序存储客户端和访问令牌所需的表:

php artisan migrate

接下来,您应该运行 passport:install 命令。此命令将创建生成安全访问令牌所需的加密密钥。此外,该命令将创建“个人访问”和“密码授予”客户端,用于生成访问令牌:

php artisan passport:install

欲了解更多信息,请查看官方 Laravel 文档

【讨论】:

  • 它已经在项目中实现并且基于令牌的 api URL 正在使用它。但是当前的 api 都使用 POST 方法,并且参数是在请求正文中传递的。所以我们不能改变现有的结构。
  • 如果您无法更改实现,请使用 Lkeskowy 的解决方案并尝试通过请求标头传递令牌
猜你喜欢
  • 2014-12-11
  • 1970-01-01
  • 2017-04-20
  • 2012-10-22
  • 2014-10-30
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多