pecl / oauth vs pecl / oauthprovider签名不匹配

时间:2012-04-10 16:01:28

标签: php oauth pecl oauth-provider

我使用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

这显然是完全相同签名的网址转义版本。这是一个错误还是我公然错过了什么?

2 个答案:

答案 0 :(得分:0)

如我的问题所述,这两个签名是相同的,只有一个是编码的网址。这不是规范的一部分,没有记录,但确实如此。我的最终解决方案检查签名匹配和url编码的签名匹配。 这并不理想,因为有可能存在错误匹配,但如果不从头开始重写整个算法,我几乎无能为力。

答案 1 :(得分:0)

OAuthProvider :: $ signature是来自消费者请求的oauth_signature的解码值,不是 OAuthProvider计算的签名。因此,打印OAuthProvider收到的授权标头将包括oauth_signature="3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D",而OAuthProvider :: $签名将显示3qBMmue4Q+j8Dm4/9VSTl6y0TR8=

如果您的工作是从Authorization标头(或等效标识)获取oauth_signature并将其与编码的OAuthProvider :: $ signature进行比较......那些将始终匹配!

OAuthProvider抛出签名不匹配异常的问题是未向OAuthProvider :: checkOAuthRequest()提供端点URI的结果。文档表明这是可选的,但需要包含它,因为它是签名基本字符串的一部分。