【发布时间】:2012-04-22 22:46:41
【问题描述】:
我使用 pecl oauth 包编写了一个简单的 oauth 提供者和消费者。一切都很顺利,直到我尝试获取访问令牌,此时我收到签名不匹配错误。 oauth 消费者尝试通过以下方式使用 oauth->getauthorizedtoken 联系提供者:
$res = mysql_query("SELECT * FROM request_tokens WHERE oauth_token = '".mysql_real_escape_string($token)."'");
$requestToken = mysql_fetch_assoc($res);
$oauth->setToken($token, $requestToken['oauth_token_secret']);
$authToken = $oauth->getAccessToken("http://dev.myserver.com/~testbranch/?m=oauthMod&act=authorize", NULL, $verifier);
当失败时,它会输出带有如下签名的调试信息:
3qBMmue4Q+j8Dm4/9VSTl6y0TR8=
在提供者方面,消费者和令牌经过验证,然后它因签名不匹配而失败,即使它计算的签名是:
3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D
这显然是完全相同签名的 url 转义版本。这是一个错误还是我公然遗漏了什么?
【问题讨论】:
-
如何计算签名?为什么是 urlencoded?
-
据我所知,pecl 的 oauth 和 oauth 提供者都生成签名。在提供者端生成的一个遵循oauth.net/core/1.0a/#encoding_parameters 规范。好像oath包没有对参数进行编码?
-
第一个没有编码,第二个是。但是:
rawurlencode('3qBMmue4Q+j8Dm4/9VSTl6y0TR8=') === '3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D'; -
我倒退了,OAuthProvider 类似乎没有遵循规范,而 OAuth 类却遵循了。
-
然后寻找
rawurldecode。并在您的示例代码中显示,特别是您遇到问题的地方。
标签: php oauth pecl oauth-provider