如何用PHP读取OAuth请求参数?

时间:2011-07-05 11:57:06

标签: php oauth header

我正在尝试使用两条腿OAuth作为身份验证机制将iPhone应用程序连接到PHP API。我正在使用http://code.google.com/p/oauth/中的PHP和Objective-C 2.0库。问题是,当我尝试使用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标头的最佳方法是什么?

1 个答案:

答案 0 :(得分:8)

  

我认为两种方式对于OAuth规范同样有效,对吧?

是的,没错。

  

用PHP读取Authorization标头的最佳方法是什么?

PHP中的请求标头存储在$_SERVER超全局数组中,每个标头都作为它自己的条目:$_SERVER['HTTP_AUTHORIZATION']很可能在你的情况下,只是做

var_dump($_SERVER);

并查找信息。 Detailed information how PHP deals with the HTTP request

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。帽子乔恩尼兰德。