Tho*_*mer 4 iphone authentication encryption oauth objective-c
我正在使用 Jon Crosby 的开源 Objective-C OAuth 库http://code.google.com/p/oauthconsumer/进行一些基本的 http 身份验证,它不处理令牌,只处理消费者密钥和消费者秘密。我的代码非常适用于 GET、带有 URL 参数的 GET 和 POST。但是,当我发出在 URL 中有参数的 POST 请求时,该请求授权失败。我试图找出原因。
服务器正在使用 Apache Commons OAuth,因此我想将我的基本字符串与该库进行比较。这是一个人为的示例以及我的库生成的基本字符串和签名。任何人都可以看到问题是什么?
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
Run Code Online (Sandbox Code Playgroud)
此数据生成以下 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"
Run Code Online (Sandbox Code Playgroud)
显然我的签名是错误的。问题要么出在基本字符串的构造中,要么出在 HMAC-SHA1 函数的实现方式中(使用来自 CommonHMAC.h 的 Apple 的 CCHmac,所以希望不是这样),或者出在我的 Base64Transcoder 上,它是开源 C. 2003 年,Jonathan Wight/Toxic Software。我主要怀疑基本字符串,因为请求适用于 GET 和 POST,并且只有在使用上述 URL 参数的 POST 时才会失败。
有很多 OAuth 经验的人能发现上面的问题吗?其他非常有用的是 Apache Commons OAuth 在其身份验证中生成的基本字符串。谢谢。
根据RFC 5849 第 3.4.1.2 节,OAuth 基本字符串 URI 不包括查询字符串或片段。如果客户端或服务器没有从基本字符串 URI 中删除查询参数并将它们添加到规范化的 OAuth 参数列表中,则签名将不匹配。不幸的是,很难说哪一方犯了这个错误。但是很容易确定这是问题所在:如果它在没有查询参数的情况下总是有效但在查询参数时总是失败,您可以非常确定一侧或另一侧生成了错误的基本字符串。(但请确保它总是发生……间歇性错误可能是别的东西。同样,如果它从不使用或不使用查询字符串,那也将是别的东西。) 另一种可能性是规范化操作不正确——参数列表必须排序并且编码序列的百分比必须是大写的。如果双方没有正确规范化,也会导致基本字符串不匹配,从而导致签名不匹配。
| 归档时间: |
|
| 查看次数: |
6298 次 |
| 最近记录: |