Iphone OAuth有问题,POST有参数

Iphone OAuth有问题,POST有参数,iphone,objective-c,authentication,encryption,oauth,Iphone,Objective C,Authentication,Encryption,Oauth,我正在使用Jon Crosby的开源Objective-C OAuth库进行一些基本的http身份验证,它不处理令牌,只处理使用者密钥和使用者机密。我的代码非常适用于GET、在URL中使用参数GET和POST。但是,当我发出一个在URL中包含参数的POST请求时,该请求将无法通过授权。我在想原因 服务器正在使用ApacheCommonsOAuth,因此我想将我的基本字符串与该库进行比较。下面是一个人为的示例,以及我的库生成的基本字符串和签名。有人知道问题出在哪里吗 consumer key:

我正在使用Jon Crosby的开源Objective-C OAuth库进行一些基本的http身份验证,它不处理令牌,只处理使用者密钥和使用者机密。我的代码非常适用于GET、在URL中使用参数GET和POST。但是,当我发出一个在URL中包含参数的POST请求时,该请求将无法通过授权。我在想原因

服务器正在使用ApacheCommonsOAuth,因此我想将我的基本字符串与该库进行比较。下面是一个人为的示例,以及我的库生成的基本字符串和签名。有人知道问题出在哪里吗

consumer key:    abcdef
consumer secret: ghijkl
POST request:    http://emptyrandomhost.com/a/uriwith/params?interesting=foo&prolific=bar
my base string:  POST&http%3A%2F%2Femptyrandomhost.com%2Fa%2Furiwith%2Fparams&interesting%3Dfoo%26oauth_consumer_key%3Dabcdef%26oauth_nonce%3D1%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D2%26oauth_version%3D1.0%26prolific%3Dbar
此数据生成以下OAuth头授权:

Authorization: OAuth oauth_consumer_key="abcdef", 
                     oauth_version="1.0", 
                     oauth_signature_method="HMAC-SHA1", 
                     oauth_timestamp="2", 
                     oauth_nonce="1", 
                     oauth_signature="Z0PVIz5Lo4eB7aZFT8FE3%2FFlbz0%3D"
显然我的签名是错的。问题要么在于基本字符串的构造,要么在于HMAC-SHA1函数的实现方式(使用CommonHMAC.h中Apple的CCHmac,所以希望不是这样),要么在于我的Base64代码转换器,它是开源c。2003年乔纳森·怀特/有毒软件公司出版。我主要怀疑是基字符串,因为请求用于GET和POST,并且只在具有上述URL参数的POST中失败


有很多OAuth经验的人能发现上面的问题吗?另一个非常有用的是ApacheCommonsOAuth在身份验证中生成的基本字符串。谢谢。

根据,OAuth基本字符串URI不包括查询字符串或片段。如果客户机或服务器没有从基本字符串URI中删除查询参数并将其添加到规范化的OAuth参数列表中,则签名将不匹配。不幸的是,很难说是哪一方犯了这个错误。但很容易确定这就是问题所在:如果它总是在没有查询参数的情况下工作,但在查询参数的情况下总是失败,那么可以非常肯定的是,其中一方生成了错误的基字符串。(请确保它总是发生……间歇性错误可能是另外一种情况。类似地,如果它在使用或不使用查询字符串的情况下都无法工作,那也可能是另外一种情况。)另一种可能是规范化操作不正确-参数列表必须排序,编码序列的百分比必须大写。如果两边都没有正确规范化,这也会导致基本字符串不匹配,从而导致签名不匹配。

您可以通过以下URL构建并检查您的请求:


打开由[+]符号表示的框并填写您的值,这样您就可以查看问题是在代码还是在提供程序端。

尝试为这些键定义常量。这将有助于根除打字错误,并使它更容易改变te键,如果需要的话。鲍勃,谢谢你告诉我的RFC 5849。第3.4.1.1节提供了加密中使用的基本字符串的完整示例。我能够验证它是否与我自己的基本字符串完全匹配。这不是个好兆头…这似乎是一个常见的错误,OAuth文档中没有明确说明,GET或POST中包含的参数必须进行排序-(比如..a=1&b=2..b=2&a=1会给出一个错误),但是,您可以执行GET和POST参数以及来自授权标头的参数。这些都必须合并,然后进行排序。这个网站帮助我找到了我的库不恰当地编码参数对的问题。我想我已经准备好了,谢谢!有趣。通常在编码问题上,错误是间歇性的。有时你会得到一个没有任何特殊字符的字符串,因此即使代码是错误的,转义结果也是正确的。我相信你是对的,鲍勃。我不得不反复修改OAuthConsumer库代码,现在我转到另一个POST请求,其中包含了更多参数,签名又错了。回到绘图板。:)这次Lyuben的web应用程序让我失望,因为它只支持11个参数,而我现在有15个参数\有现代版的链接吗?看起来交互式演练不再有效。