我正在尝试将iPhone应用程序连接到PHP API,使用2列OAuth作为身份验证机制。我使用的PHP和Objective-C 2.0库来自http://code.google.com/p/oauth/。问题是,当我试图用Objective-C发出GET请求时,它没有在请求URI中包括OAuth参数,就像PHP库在发出OAuth GET请求时所做的那样:
http://www.mysite.com/oauth/index.php?oauth_consumer_key=key&oauth_nonce=XXXXXXXX&oauth_signature=XXXXXXXXXXX%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1309863754&oauth_version=1.0
相反,它将OAuth参数放在Authorization头中:
Authorization: OAuth realm="", oauth_consumer_key="XXXXX", oauth_token="XXXX-XXXX",
oauth_signature_method="HMAC-SHA1", oauth_signature="XXXXXXXX",
oauth_timestamp="1309863855", oauth_nonce="XXXX-XXX-XX-XX-XXXXXXX", oauth_version="1.0"
我想这两种方法对于OAuth规范都是同样有效的,对吧?
使用PHP读取Authorization标头的最佳方式是什么?
我想这两种方法对于OAuth规范都是同样有效的,对吧?
是的,对。
使用PHP读取Authorization标头的最佳方式是什么?
PHP中的请求标头存储在$_SERVER
超全局数组中,每个标头都是自己的条目:在您的情况下,很可能是$_SERVER['HTTP_AUTHORIZATION']
,只需执行
var_dump($_SERVER);
并查找信息。PHP如何处理HTTP请求的详细信息。
PHP中缺少授权标头
不幸的是,Authorization
标头是由PHP(?(过滤的,因此它不是$_SERVER
的一部分。
解决方法:apache_request_headers((
当使用PHP作为Apache模块时,解决方法是使用apache_request_headers()
函数来检索所有请求标头。
解决方法:mod_rewrite
对于F/CGI,一个解决方法是将具有Mod_Rewrite的Authorization标头设置为一个环境变量,该环境变量模仿PHP转换HTTP请求标头的方案:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)$ [NC]
RewriteRule .* - [E=HTTP_AUTHORIZATION:%1]
mod_rewrite解决方案也应该适用于使用mod_PHP运行的PHP。帽子尖Jon Nylander。