使用 PHP 进行简单 API 用户身份验证


Simple API User Authentication with PHP

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

我还将有一个谷歌浏览器扩展程序,用于在我的PHP应用程序中添加和编辑书签记录。

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

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

我有哪些选项可用于对 API 用户请求进行身份验证?

有很多

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

所以用卷曲术语来说:

1( 您的 chrome 扩展程序首先"登录"用户:

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

请注意,在这种情况下,用户的登录名和密码通过 https(安全(行发送 base-64 编码,并且需要验证用户。它使用"基本身份验证"机制通过"授权"标头发送它。

如果成功,您可以发回一个 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"(,并且您正在传递从登录 API 响应接收的用户 ID 和令牌。

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

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

此外,如果您可以为用户提供保存其密码的选项(可能不希望(,以避免在过期后通过静默获取新令牌来重新登录。

希望这有帮助。