0

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

4

2 回答 2

0

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

于 2013-08-21T15:44:40.500 回答
0

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

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

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

于 2014-11-21T21:37:26.507 回答