0

我有一个在我们的 PHP 服务器上使用 2 腿 oAuth 的应用程序。我们当前解析 php://input 流以获取签名参数和原始帖子数据。但是,根据 php.net,您不能将输入流与多部分表单数据一起使用,因此当我尝试将图像从 iPhone 发送到服务器时,php://input 流是空的。

这是我对誓言规则的新问题,什么不是。

是否需要使用输入流与从 $POST 超级全局读取?我可以在同一个电话中发送签名和图像吗?

    NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];


[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"signature"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[postVars dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];


[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"tester.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[NSData dataWithData:imageData]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

我已经看到了一些使用签名参数设置授权标头的建议。在帖子正文中发送签名或设置授权标头是否正确?另外,我在如何使用 oAuth 上传和图像方面还有路要走吗?是否需要 2 次通话,或者我可以在同一次通话中进行签名和图像处理?

谢谢您的帮助。我们使用它来将数据从 iPhone 发送到我们的服务器,因此我们编写了双方,但希望遵循 oAuth 最佳实践。

4

2 回答 2

0

Oauth 更喜欢在授权标头中设置的 oauth 参数(请参见此处)。提供者期望的所有内容都应该在该标头中,包括通过对动词、url、post 参数、各种 oauth 参数等进行签名而形成的签名,按词法排序。

请求的其余部分可以是您想要的任何内容,例如图片帖子,是否是多部分的。

于 2013-01-28T23:26:57.267 回答
0

@danh 给了我我需要的答案,但我只是想扩展它。

在 iOS 中,我设置了 Authorization 标头 [request setValue:authorizationHeader forHTTPHeaderField:@"Authorization"];

此标头包含我的签名、appid、时间戳等的 JSON 字符串。

我从除图像文件之外的所有参数生成签名。OAuth 说您从 URLEncode 内容类型生成签名库,因此由于图像不是 URLEncode 类型,您不必在签名库中使用它们的任何部分。这意味着您可以将您的图像和您在签名中使用的任何参数作为 POST 正文的一部分发送。

我的看起来像这样

NSString *boundary = @"---------------------------14737809831466499882746641449";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", @"data"] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[jsonData dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"%@\"\r\n", imagename] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[NSData dataWithData:imageData]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];

在我的服务器上,我可以解析 HTTP_AUTHORIZATION 标头来获取我的 oAuth 值,使用 $_POST 来获取我的参数和 $_FILES 来获取我的图像。所有这些仍然遵循 oAuth 准则。谢谢您的帮助。

于 2013-01-30T00:35:49.650 回答