我使用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
这显然是完全相同签名的网址转义版本。这是一个错误还是我公然错过了什么?
答案 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的结果。文档表明这是可选的,但需要包含它,因为它是签名基本字符串的一部分。