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

时间:2016-02-04 23:39:29

标签: php api authentication oauth

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

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

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

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

我有什么选择来验证API用户请求?

1 个答案:

答案 0 :(得分:2)

有很多方法可以为这只猫提供皮肤,但假设你的Chrome扩展程序需要一个登录名和密码来连接到服务器端点(即用户已在服务器端向你的应用注册),可以支持在'login'api之后返回一个临时令牌(它可能有一个到期时间),然后在所有其他书签apis的'Authorization'标题中发送此令牌。

所以卷曲方面:

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

这里我假设有一个'list'api,你正在检索属于用户的书签列表(HTTP GET)。

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

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

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

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

希望这有帮助。