PHP:使用与时间戳混合的令牌保护 Rest 服务
PHP: Secure a Rest Service with a Token mixed with Timestamp
我有一个我的网站调用它的休息服务,我想确保它尽可能不在我的网站外部调用。
我想创建一个混合时间戳的令牌,这样用户只能在 10 分钟(例如)内使用服务器中生成的令牌调用服务。
让我用一些伪代码来解释一下:
1) 服务器: 令牌是在服务器中使用私钥和时间戳生成的:
// The token is valid only for 10 minutes after 'time'
$token = encrypt($pKey, timestamp); // Server Time
2) 客户端: 我们将令牌放在 javascript 变量中,并在我们的请求中使用它和客户端的时间戳:
var token = '<?= $token ?>';
var params = {
token : token,
time : timestamp, // Client Time
data : mydata
}
3)服务器:如果时间参数混入token不等于10分钟token,则请求无效:
// I'm Stuck Here
$something = decrypt($pKey, $_POST['token'], $_POST['time']);
if ($something != $tenMinutes) { // Invalid Request }
问题:
1)这是senarioO.K吗?如果是,确切的解决方案是什么?如果否,那么解决方案是什么?
2) 还有另一个 senario 来保护我在 AWS 中看到的请求:http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
如何在 PHP 中实现它?
从客户端获得 token
后,您需要检查两件事:令牌的有效性及其时间戳。
有两种情况:
使timestamp
成为令牌的一部分:
function getToken($timestamp) {
return $timestamp . encrypt(getPKey(), $timestamp);
}
$token = genToken(time());
然后验证它:
$token = $_POST['token'];
function validate($token) {
$timestamp = substr($token, 0, 10);
return
(genToken($timestamp) == $token)
&& ($timestamp >= time() - 600);
}
- 将生成的令牌连同时间戳一起保存在数据库中,并在从客户端获取令牌后检查相应的时间戳。
我有一个我的网站调用它的休息服务,我想确保它尽可能不在我的网站外部调用。
我想创建一个混合时间戳的令牌,这样用户只能在 10 分钟(例如)内使用服务器中生成的令牌调用服务。
让我用一些伪代码来解释一下:
1) 服务器: 令牌是在服务器中使用私钥和时间戳生成的:
// The token is valid only for 10 minutes after 'time'
$token = encrypt($pKey, timestamp); // Server Time
2) 客户端: 我们将令牌放在 javascript 变量中,并在我们的请求中使用它和客户端的时间戳:
var token = '<?= $token ?>';
var params = {
token : token,
time : timestamp, // Client Time
data : mydata
}
3)服务器:如果时间参数混入token不等于10分钟token,则请求无效:
// I'm Stuck Here
$something = decrypt($pKey, $_POST['token'], $_POST['time']);
if ($something != $tenMinutes) { // Invalid Request }
问题:
1)这是senarioO.K吗?如果是,确切的解决方案是什么?如果否,那么解决方案是什么?
2) 还有另一个 senario 来保护我在 AWS 中看到的请求:http://docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
如何在 PHP 中实现它?
从客户端获得 token
后,您需要检查两件事:令牌的有效性及其时间戳。
有两种情况:
使
timestamp
成为令牌的一部分:function getToken($timestamp) { return $timestamp . encrypt(getPKey(), $timestamp); } $token = genToken(time());
然后验证它:
$token = $_POST['token'];
function validate($token) {
$timestamp = substr($token, 0, 10);
return
(genToken($timestamp) == $token)
&& ($timestamp >= time() - 600);
}
- 将生成的令牌连同时间戳一起保存在数据库中,并在从客户端获取令牌后检查相应的时间戳。