【问题标题】:Laravel 5.4: how to protect api routesLaravel 5.4:如何保护 api 路由
【发布时间】:2017-10-12 14:24:42
【问题描述】:

我有一个 react 应用程序,可以从在 routes/api.php 中定义的 laravel api 获取数据:

// this is default route provided by laravel out of the box
Route::middleware('auth:api')->get('/user', function (Request $request) {
            return $request->user();
        });

// ItemController provides an index methods that list items with json
Route::resource('items', 'Api\ItemController', array('except' => array('create','edit')));

// this is to store new users
Route::resource('users', 'Api\UserController', array('only' => array('store')));

例如http://example.com/api/items 按预期返回数据,但它确实不安全,因为任何人都可以通过邮递员访问它。

如何使这些路线只能在应用内访问?

由于我是新手,我不明白是否需要设置 api_token 以及如何设置?

我需要设置 Passport 吗?

是否与 auth:api 中间件有关?

这听起来很基础,但我们将不胜感激任何帮助或教程建议

编辑

以经典会话身份验证结束。在 web.php 中移动了路由。在 ajax 请求中传递 csrf 令牌。实际上我不需要 RESTful API。当您的 API 是无状态的时,您只需要令牌身份验证。

【问题讨论】:

  • 使用 laravel 护照并创建一个客户端,然后在每个请求的标头中使用 Bearer $token,护照中间件将处理它以进行保护
  • 谢谢,但是您如何从您的个人客户端检索令牌?
  • @msonowal 这是最好的方法。你能添加一个答案如何做到这一点

标签: laravel


【解决方案1】:

当您使用 Laravel 5.4 时,您可以使用 Passport,但我还没有实现,但我为我的一个 laravel 项目实现了 lucadegasperi/oauth2-server-laravel,它是在 Laravel 5.1 中开发的

这里是github仓库的链接 lucadegasperi/oauth2-server-laravel

这里是文档链接Exrensive Documentation

只需将包添加到composer json并运行composer update,包就会安装到您的应用程序中,安装后添加提供者数组类和别名数组类,如文档的Laravel 5安装部分所述,

您必须进行一些小调整才能完美地从 $middleware 数组中剪切 csrf 并将其粘贴到 $routeMiddleware 数组中并再次运行 php artisan vendor:publish 发布后将创建迁移并运行迁移@ 987654328@

如果您只想保护每个客户端(如 ios、android 和 web)的 api 路由,您可以实现客户端凭据授予,或者如果您需要为每个用户提供 oauth,您可以使用密码授予或其他方式实现授权服务器。 ,

永远不要使用客户端 ID 或其他凭据,在表单中生成访问令牌,而是将其添加到 helper 中的某个位置并将其附加到 api 的请求中,

希望这个答案对您有所帮助。

【讨论】:

    【解决方案2】:

    你可以使用JWT,它很容易让它工作。您基本上通过请求用户名/密码并在每个需要身份验证的请求中传递该令牌来生成令牌,您的 URL 看起来像 http://example.com/api/items?token=SOME-TOKEN。如果没有适当的令牌,他就无法访问此端点。

    至于

    如何让这些路线只能在应用内访问?

    如果您的意思是只有您的应用可以使用这些请求,那么您不能。基本上,API 不知道是谁在发送这些请求,他只能检查您提供的内容是否正确,如果一切正常,则继续处理。我建议你看看this question

    【讨论】:

    • 谢谢,但我不明白“用户”是匿名的,因为我使用的数据不需要身份验证。即使您没有登录,也会显示项目。注册也是一样,我不知道用户名和密码...
    • 好吧,当然,在注册时,您事先并不知道用户名和密码,这就是为什么这个特定端点不会受到令牌保护,但是当他们登录时,您会使用这些凭据请求令牌然后您可以在其他端点上传递此令牌。您不希望未注册到您系统的人看到您的数据吗?
    • 我没抓住重点。即使您没有登录,项目也会显示在应用程序中。但是我不希望 example.com/api/items 及其结果可以从外部访问
    • 你可以让如果用户没有登录,这个端点仍然返回一些东西,但是如果你有的话,隐藏一些敏感数据。看看 Ebay,即使你没有登录他们的网站,你仍然可以看到项目。您的商品是否包含您可能不希望向未经身份验证的人显示的数据?
    • 数据不包含敏感信息,但作为一种全球资源,我不希望它被其他人利用......就像显示书籍列表的常规网站一样。您只希望访问您网站的人访问它,因为此列表使您的网站有价值
    猜你喜欢
    • 2019-09-13
    • 2017-06-29
    • 2018-06-28
    • 1970-01-01
    • 2018-09-12
    • 2017-09-20
    • 2023-03-28
    • 2018-04-13
    • 2015-03-11
    相关资源
    最近更新 更多