【问题标题】:Simple API User Authentication with PHP使用 PHP 进行简单的 API 用户身份验证
【发布时间】:2016-05-14 19:40:03
【问题描述】:

我正在构建一个书签应用程序,它将充当 API,以便前端 JavaScript 应用程序可以调用 URL 端点并使用简单的 PHP API 对数据库执行 CRUD 操作。

我还将拥有一个 Google Chrome 扩展程序,用于在我的 PHP 应用程序中添加和编辑书签记录。

我知道标准是在向我的 API 发出请求时使用 OAuth 之类的东西进行用户身份验证,但是设置起来似乎过于复杂,我很好奇是否有其他超级简单的方法来对发出 API 请求的用户进行身份验证。

也许是用户在登录我的应用时可以获得的某种 API 访问密钥,然后使用该密钥向那里发送类似于密码的 API 请求。

我有哪些选项可用于验证 API 用户请求?

【问题讨论】:

  • 基于 https 的基本身份验证?

标签: php api authentication oauth


【解决方案1】:

有很多方法可以给这只猫换肤,但假设您的 Chrome 扩展程序需要登录名和密码才能连接到服务器端点(即用户已经在服务器端注册了您的应用程序),一种支持跟随“登录”api 返回一个临时令牌(它可能有一个过期),然后在所有其他书签 api 的“授权”标头中发送这个令牌。

所以用 curl 术语来说:

1) 您的 chrome 扩展首先“登录”用户:

curl -u <user login id>:<user password> https://my-bookmark.com/api/v1/login

注意在这种情况下,用户的登录名和密码通过 https(安全)行发送 base-64 编码,并且需要验证用户。它使用“Basic-Auth”机制通过“Authorization”标头发送它。

如果成功,您将返回一个 200 响应,其中包含一个包含临时令牌和一些过期时间(以秒为单位)的 json 有效负载 - 例如:

{
  user_id: 12345,    // Some unique user id
  session_token: "azxvehft......."  // some long base-64 encoded value
  expires_in : 28800 // number of seconds the token is valid - say 8 hours

  // Any other useful user profile or metadata

  .
  .
}

关键是如何在服务器端生成令牌。例如,您可以这样做:

session_token = base64_encode(aes_encrypt(some_secret_key, user_login_time))

这个想法是,在随后的 API 调用中,您将在“授权”标头中传递令牌,您可以使用相同的密钥对其进行解密,并将“登录时间戳”与用户数据进行比较。

您可以只跟踪一些临时存储中的令牌以直接比较它,但它必须是加密强的伪随机数生成器。

您也可以使用用户的单向密码哈希作为上述加密的密钥。

2) 将步骤 1 中的令牌用于某个书签 api

curl -H "Authorization: MyBookmark <user_id>:<session_token>" https://my-bookmark.com/api/v1/list

这里我假设有一个“列表”api,并且您正在检索属于用户的书签列表 (HTTP GET)。

可以看出,此处的 GET 调用包含带有自定义身份验证方案的“授权”标头(此处声明为“MyBookmark”),并且您正在传递用户 ID 和从登录 API 接收的令牌回应。

在处理此请求之前,服务器必须以某种方式验证给定用户 ID 的令牌,如前所述。由于它是使用密钥的加密令牌,因此任何篡改令牌的尝试都可能导致解密步骤失败,这可能会被检测到。

您可以使用给定的过期时间缓存令牌,一旦过期,强制用户重新登录。

此外,如果您可以让用户选择保存他们的密码(可能是不可取的),以避免通过在新令牌过期后静默获取新令牌来避免重新登录。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2014-01-01
    • 2017-10-07
    • 2013-08-03
    • 2017-03-13
    • 2016-08-30
    • 1970-01-01
    相关资源
    最近更新 更多