我使用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转义版本。这是一个bug,还是我明目张胆地漏掉了什么?
发布于 2013-08-21 23:44:41
正如我在问题中提到的,这两个签名是相同的,除了一个是url编码的。这不是规范的一部分,也没有文档记录,但它就在那里。我的最终解决方案同时检查签名匹配和url编码签名匹配。这并不理想,因为存在错误匹配的机会,但如果不从头开始重写整个算法,我几乎无能为力。
发布于 2014-11-22 05:37:27
$ signature是来自消费者请求的oauth_signature的解码值,而不是OAuthProvider计算的签名。因此,打印OAuthProvider收到的Authorization头将包含oauth_signature="3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D",而OAuthProvider::$signature将显示3qBMmue4Q+j8Dm4/9VSTl6y0TR8=。
如果您的工作是从Authorization (或等效的)中获取签名,并将其与编码的OAuthProvider::$ oauth_signature进行比较...这些将总是匹配的!
我遇到的OAuthProvider抛出签名不匹配异常的问题是因为没有向OAuthProvider::checkOAuthRequest()提供端点URI。文档指出这是可选的,但需要包括它,因为它是签名基本字符串的一部分。
https://stackoverflow.com/questions/10092234
复制相似问题