如何验证使用我的Web服务的网站

时间:2014-07-04 22:51:20

标签: php web-services authentication

为了简化问题,假设我有一个PHP Web服务,它显示我的服务器的当前日期时间,并且此服务以任何平均值,纯文本,JSON对象等输出其数据。我有一个仅应该能够的网站列表使用此服务,而任何其他网站不应该有权访问此服务。

问题是:我的服务器上的PHP如何能够区分www.allowed-website.com的请求,然后授予其访问权限并禁止访问www.anyother-website.com

2 个答案:

答案 0 :(得分:1)

广泛的主题。您有很多选择,可能包括:

  • 要求主叫服务器包含凭据(用户ID和密码/密钥,或者只是用户ID,如果它不重要)

  • 要求主叫服务器包含凭据(某些用户ID)和签名

  • 按IP地址过滤

  • 使用SSL客户端证书

您可能希望了解现有Web服务如何执行身份验证/授权。许多人(Facebook,Google +,Twitter等)使用OAuth。其他(例如亚马逊)使用签名。我现在懒得考虑其他人: - )

答案 1 :(得分:1)

一种简单的方法是使用私钥实现签名请求,这样您就不需要预先验证,凭据不会通过网络发送,最重要的是,它不可能在中间攻击,攻击者只能重新发送确切的请求。

服务器和客户端都知道私钥,然后用于验证和签署请求。

<?php
$public_key = hash('sha256', 'Client identification, call it public key.');
$private_key = hash('sha256', 'A secret only the server and client know');

/**
 * Packet for POST request
 */
$packet = http_build_query(array(
    'do' => 'foo',
    'body' => 'bar'
));

/**
 * Sign the packet with private key - which returns valid request token
 */
$token = hash_hmac('sha256', $packet, $private_key);


/**
 * Build the x-headers, with public key and request token
 */
$header = array(
    'X-Public: ' . $public_key,
    'X-Token: ' . $token
);

//..do curl request with headers
?>

然后在服务器端解析x-header,根据公钥查找客户端,然后使用私钥重新hash_hmac请求,如果匹配令牌,则认证请求。

<?php

//or do a lookput on your API clients table ;p based on the public key
$public_key = hash('sha256', 'Client identification, call it public key.');
$private_key = hash('sha256', 'A secret only the server and client know');

$packet = http_build_query(array(
    'do' => $_POST['do'],
    'body' => $_POST['body']
));

if (hash_hmac('sha256', $packet, $private_key) == $headers['X-Token']){
    //valid request
}
?>