PECL/OAuth vs PECL/OAuthProvider 签名不匹配


pecl/oauth vs pecl/oauthprovider signature mismatch

我使用 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 转义版本。这是一个错误还是我公然错过了什么?

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

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

如果您的解决方法是从授权标头(或等效项)获取oauth_signature并将其与编码的 OAuthProvider::$signature ...这些将永远匹配!

我遇到的OAuthProvider抛出签名不匹配异常的问题是没有向OAuthProvider::checkOAuthRequest()提供端点URI。 文档指示这是可选的,但需要包含它,因为它是签名基字符串的一部分。