繁体   English   中英

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

[英]Simple API User Authentication with PHP

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

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

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

用户登录到我的应用程序后,可能会获得某种API访问密钥,然后使用该密钥与该API一起发送与密码类似的API请求。

我在这里有哪些用于验证API用户请求的选项?

有很多方法可以使这只猫变皮,但是假设您的Chrome扩展程序需要登录名和密码才能连接到服务器端点(即用户已经在服务器端向您的应用程序注册了),则可能会支持以下“登录” '会返回一个临时令牌(可能会过期)的api,然后在所有其他书签api的'Authorization'标头中发送此令牌。

因此,在卷曲方面:

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调用中,您将在“ Authorization”标头中传递令牌,您可以使用相同的密钥对其进行解密,并将“ login timestamp”与用户数据进行比较。

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

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

2)使用第1步中的令牌到某个书签api

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

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

可以看出,这里的GET调用包括带有自定义auth方案的“ Authorization”标头(此处声明为“ MyBookmark”),并且您正在传递用户ID和从登录API响应接收到的令牌。

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

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

另外,如果您可以让用户选择保存密码(可能不希望这样做),以免在密码过期后通过静默获取新令牌来避免重新登录。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM