oAuth 风格 NSURLRequest 与图像

问题描述 投票:0回答:2

我有一个应用程序在我们的 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 上传和图像方面还差得远吗?是否需要两次通话,或者我可以在同一次通话中进行签名和图像吗?

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

ios objective-c file-upload oauth
2个回答
0
投票

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

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


0
投票

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

在 iOS 中我设置了授权标头

[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 准则。感谢您的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.