Php pecl/oauth与pecl/oauthprovider签名不匹配

Php pecl/oauth与pecl/oauthprovider签名不匹配,php,oauth,pecl,oauth-provider,Php,Oauth,Pecl,Oauth Provider,我使用PECLOAuth包编写了一个简单的oauth提供者和使用者。在我尝试获取访问令牌之前,一切都进展顺利,在这一点上,我得到了一个签名不匹配错误。oauth使用者尝试通过以下方式使用oauth->getauthorizedtoken与提供者联系: $res = mysql_query("SELECT * FROM request_tokens WHERE oauth_token = '".mysql_real_escape_string($token)."'"); $requestToken

我使用PECLOAuth包编写了一个简单的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转义版本。这是一个bug还是我明显遗漏了什么?

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

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

如果您的解决方法是从授权头或等效文件获取oauth_签名,并将其与编码的OAuthProvider进行比较::$signature。。。这些永远匹配


我在OAuthProvider引发签名不匹配异常时遇到的问题是,没有向OAuthProvider::checkOAuthRequest提供端点URI。文档表明这是可选的,但需要包括在内,因为它是签名基字符串的一部分。

如何计算签名?为什么是urlencoded?据我所知,pecl的oauth和oauth提供者都生成签名。在提供者端生成的一个遵循规范。似乎宣誓包没有对参数进行编码?第一个没有编码,第二个是。但是:rawurlencode'3qBMmue4Q+j8Dm4/9VSTl6y0TR8='==='3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D';我倒过来看,类OAuthProvider似乎不遵循规范,而OAuth类遵循规范。并使其在示例代码中可见,在这里您特别遇到了问题。