Plsql PL/sqlopenid+;OAuth实现-400-错误请求

Plsql PL/sqlopenid+;OAuth实现-400-错误请求,plsql,oauth,openid,Plsql,Oauth,Openid,我正在尝试使用PL/SQL实现(OpenId+OAuth)混合协议。 我已经为我的站点成功地通过google设置了OpenID身份验证,用户被定向到google帐户进行身份验证。成功身份验证后,用户将重定向回example.com,并附加OAuthRequestToken。 然后我尝试将此令牌与OAuthAccessToken交换,以访问各种google服务。 混合(OpenID+OAuth)身份验证后获得的OAutherRequestToken如下所示: oauth_token = 4/AR1

我正在尝试使用PL/SQL实现(OpenId+OAuth)混合协议。 我已经为我的站点成功地通过google设置了OpenID身份验证,用户被定向到google帐户进行身份验证。成功身份验证后,用户将重定向回example.com,并附加OAuthRequestToken。 然后我尝试将此令牌与OAuthAccessToken交换,以访问各种google服务。 混合(OpenID+OAuth)身份验证后获得的OAutherRequestToken如下所示:

oauth_token = 4/AR17dDMb4xHG3L4WFYLIzkhCj0c7
oauth_base_string = GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetAccessToken&oauth_consumer_key%3Dexample.com%26oauth_nonce%3D56575A5754587057576E6C77576B78695757354F%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1308046070%26oauth_version%3D1.0%26oauth_token%3D4%2FAR17dDMb4xHG3L4WFYLIzkhCj0c7
我得到的
oauth\u base\u字符串如下所示:

oauth_token = 4/AR17dDMb4xHG3L4WFYLIzkhCj0c7
oauth_base_string = GET&https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthGetAccessToken&oauth_consumer_key%3Dexample.com%26oauth_nonce%3D56575A5754587057576E6C77576B78695757354F%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1308046070%26oauth_version%3D1.0%26oauth_token%3D4%2FAR17dDMb4xHG3L4WFYLIzkhCj0c7
然后,我在查询字符串本身中请求将此oauth_令牌(OAuthRequestToken)与OAuthAccessToken交换,如下所示:

https://www.google.com/accounts/OAuthGetAccessToken?oauth_consumer_key=example.com&oauth_token=4/AR17dDMb4xHG3L4WFYLIzkhCj0c7&oauth_signature_method=HMAC-SHA1&oauth_签名=rpqslgp5nigvl8w4vmc8inufffq%3D&oauth_时间戳=1308046070&oauth_当前=56575a5745870576e6c77576b786957354f&oauth_版本=1.0

这将导致400错误的请求

我试过寻找类似的东西,但还是没有运气。 从堆栈溢出处理类似的问题。上面说

…%转义可能是一个问题

这有点让人困惑

我们是否必须在请求中urlencode
oauth_签名
param两次

我正在使用以下代码生成oauth_签名

oauth_sig_mac := DBMS_CRYPTO.mac (UTL_I18N.string_to_raw
 (oauth_base_string,
 'AL32UTF8'),DBMS_CRYPTO.hmac_sh1,
 UTL_I18N.string_to_raw (oauth_key,
 'AL32UTF8'));

 oauth_signature := UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode
 (oauth_sig_mac));
在这里:

非常感谢您的帮助。

我建议使用来测试您的api。太棒了

我使用oauth 1.0调用Zero api,因此我不确定它是否只是端点不同,但您可以检查以下几点:

对从上一个请求接收的oauth令牌进行编码,以便“/”是ASCII编码的

并且,通过runscope测试您的api,检查您的时间戳是否为旧的或新的,这将引发错误的请求


p.s一个错误的请求比401授权的错误要好,所以当我还在处理这个问题时,你的错误几乎就在那里了

,这里有一个更新。我将上面生成的基本字符串参数分别与PHP/JAVA库生成的参数进行了比较。我发现的唯一区别是'oauth_nonce'参数的长度。当PHP/JAVA LIB生成长度为32的“oauth\u nonce”时,上述过程生成长度为40的“oauth\u nonce”。我修改了上面的代码以生成相同长度32的“oauth_nonce”。然而,我仍然会遇到同样的错误——“400-错误请求”。嗨,我将自己实现类似的东西。您最终实现了吗?在誓言签名变量中是否缺少http://或https://呢?