轻量级方法是生成可以使用HMAC自我验证的令牌。在服务器上,您将使用say generate_token($secret)
生成令牌并将其发送给客户端。客户端必须在其响应中包含令牌。使用valid_token($secret, $token)
验证服务器上的令牌。
为了防止重复使用令牌,您必须存储用过的令牌。例如,您可以在继续执行请求之前将使用过的令牌存储在具有唯一约束的db-record中。如果在约束上插入失败,则表示已重新使用该令牌。
令牌生成和验证的示例:
function generate_token($secret) {
return build_token($secret, bin2hex(random_bytes(5)));
}
function build_token($secret, $id) {
return $id . '-' . hash_hmac('ripemd160', $id, $secret);
}
function valid_token($secret, $token) {
$parts = explode('-', $token);
return $token === build_token($secret, $parts[0]);
}
还有其他方法。您可以生成随机ID并存储它们。然后在使用它们后从商店中删除它们。那你就不需要秘密了。我更喜欢存储用过的令牌,因为它直到最后一步都是无状态的。
编辑:请注意,为了防止CSRF,令牌必须包含用户特定的ID。在PHP中,session_id()
通常可以用于此。一个非常简单的方法将session_id()
连接到$secret
,如generate_token($secret . session_id())
和valid_token($secret . session_id(), $token)
。我希望你明白这个主意。