我正在构建一个书签应用程序,它将充当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 的令牌,如前所述。由于它是使用密钥的加密令牌,因此任何篡改令牌的尝试都可能导致解密步骤失败,这可能会被检测到。
您可以使用给定的过期时间缓存令牌,一旦过期,就会强制用户重新登录。
此外,如果您可以为用户提供保存其密码的选项(可能不希望(,以避免在过期后通过静默获取新令牌来重新登录。
希望这有帮助。