【问题标题】:pecl/oauth vs pecl/oauthprovider signature mismatchpecl/oauth vs pecl/oauthprovider 签名不匹配
【发布时间】:2012-04-22 22:46:41
【问题描述】:

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

【问题讨论】:

  • 如何计算签名?为什么是 urlencoded?
  • 据我所知,pecl 的 oauth 和 oauth 提供者都生成签名。在提供者端生成的一个遵循oauth.net/core/1.0a/#encoding_parameters 规范。好像oath包没有对参数进行编码?
  • 第一个没有编码,第二个是。但是:rawurlencode('3qBMmue4Q+j8Dm4/9VSTl6y0TR8=') === '3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D';
  • 我倒退了,OAuthProvider 类似乎没有遵循规范,而 OAuth 类却遵循了。
  • 然后寻找rawurldecode。并在您的示例代码中显示,特别是您遇到问题的地方。

标签: php oauth pecl oauth-provider


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-23
      • 1970-01-01
      • 2012-12-10
      • 2016-12-31
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多