【问题标题】:How to generate temporary API keys with Symfony 4如何使用 Symfony 4 生成临时 API 密钥
【发布时间】:2018-04-23 15:37:00
【问题描述】:

提供一些背景知识 - 我目前有一个 API,但我希望我的移动应用能够与之通信。我查看了以下链接以为此设置身份验证。它涉及我如何验证客户端(在本例中为移动设备),如果他们传递 API 密钥 - 问题是它没有涉及密钥的实际创建方式。

http://symfony.com/doc/current/security/api_key_authentication.html

理想情况下,我希望移动应用程序为用户提供登录机会(用户名/密码),并且在他们登录后,API 会生成一个 API 密钥,用户将使用该密钥进行所有后续请求。

有人用 Symfony 4 做过这个吗?

【问题讨论】:

  • 你刚刚描述过 oauth(2) 吗?
  • 我并没有真正考虑过 oauth,因为我认为这与授予第三方应用程序代表您访问 API 的权限更相关。我想这在这种情况下可以工作,因为移动客户端将充当“第三方应用程序”。不过,我希望有更简单的东西——我只想直接登录到 API 系统,因为我控制两端(不涉及第 3 方应用程序或服务)。在这种情况下你还会推荐 oauth 吗?
  • 只是做了更多阅读 - 看起来 oauth 将是这里的最佳选择。我会修改问题。
  • getUserByApiKey 的细节由你来实现。最简单的方法是创建另一个表,其中每个用户将通过其 ID 链接到这样的键,并在其中查看键是否存在且有效。可以以所需的格式创建键,并使用它作为主键或通过对其进行手动选择来检查该表中的唯一性。要生成实际密钥,您可以使用 UUID 或 uniq 函数变体。我已经使用 Laravel 和 Sentinel 提供程序完成了这项工作,但是通过阅读文档可以看到它们在方法上非常相似。
  • @DanielProtopopov - 实际的登录部分呢?我是否只使用现有的/login 路径登录并从移动设备发布用户名/密码?另一个问题是如何告诉 Symfony 安全组件在成功登录后返回 API 密钥(假设我在 User 表中创建/存储密钥)

标签: php api symfony symfony4


【解决方案1】:

您将它们混合在一起。 API 密钥可替代用户名/密码。您不应该混合返回相同的函数,因为它会产生不确定性 - 如果您在 API 中的登录函数返回基于 API 密钥或用户名/密码的授权令牌,那么让它这样做,仅此而已。

阅读第 3 部分 - 它主要描述了如何在不存在 cookie 的 API 环境中模拟会话。 API 中的身份验证令牌 = Web 中的会话 cookie,您必须自己存储它,因为 API 中没有会话。大部分功能都在那里,你必须在它告诉你的地方填写文档中的空白。

【讨论】:

  • 我了解 API 密钥背后的整个前提,以及如何模拟会话等。我想了解的是初始登录(它将生成/获取 API 密钥)。目前唯一使用 API 的客户端是 Vue 应用,它在本地运行——用户使用传统的登录表单登录,而 Vue 应用能够使用会话,因此不需要 API 密钥。
  • 我在另一条评论中的问题是我是否可以利用现有的/login 路径(在移动应用程序中),并发布用户名/密码(用于初始请求),以获取 API密钥,任何后续请求都将使用该 API 密钥来请求数据。
  • 所以我知道API密钥是用户名/密码的替代品;但是必须有一个初始登录才能获得该 API 密钥。一旦移动应用程序拥有 API 密钥,只要它有效,它就可以为所有请求存储它。如果它失去有效性,移动应用程序会让用户再次登录以获取更新的 API 密钥。
  • 确实如此,因为通常有个人机柜用户第一次登录。可以向用户发送一封带有新创建的 API 密钥的电子邮件,但在初始登录后将其返回是……不明智的。
  • 是的,但我正在寻找一个特定于 Symfony 4 的解决方案。我完全可以做一个开箱即用的解决方案,我有一个自定义登录点;但我想用内置的 Symfony 安全框架来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 2019-07-27
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多