php
  • oauth
  • pecl
  • oauth-provider
  • 2012-04-10 81 views 0 likes 
    0

    我使用pecl oauth包编写了一个简单的oauth提供程序和消费者。一切都很顺利,直到我试图获得访问令牌时,我得到一个签名不匹配错误。 OAuth用户端尝试使用到与供应商联系的oauth-> getauthorizedtoken以下列方式:pecl/oauth vs pecl/oauthprovider签名不匹配

    $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 
    

    这显然是一个网址转义版本完全相同的签名。这是一个错误还是我公然错过了一些东西?

    +0

    你如何计算签名?为什么使用urlencoded? – hakre 2012-04-10 16:04:26

    +0

    据我所知,pecl的oauth和oauth提供者都会生成签名。在提供者端生成的那个遵循http://oauth.net/core/1.0a/#encoding_parameters规范。似乎誓言包不编码参数? – Nielsvh 2012-04-10 17:02:49

    +0

    第一个没有编码,第二个是。但是:'rawurlencode( '3qBMmue4Q + j8Dm4/9VSTl6y0TR8 =')=== '3qBMmue4Q%2Bj8Dm4%2F9VSTl6y0TR8%3D';' – hakre 2012-04-10 17:06:07

    回答

    0

    正如我的问题所述,这两个签名与一个例外是一样的url编码。这不是规范的一部分,也没有记录,但它是。我的最终解决方案检查签名匹配和url编码签名匹配。 这并不理想,因为有错误匹配的机会,但是如果不从头开始重写整个算法,我就无能为力了。

    0

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

    如果你的工作各地从授权头(或同等学历)获得oauth_signature并将其与编码OAuthProvider :: $签名......那些永远匹配!

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

    相关问题