0

PHP サーバーで 2 レッグ oAuth を使用するアプリがあります。現在、php://input ストリームを解析して、署名パラメーターと生の投稿データを取得します。ただし、php.net によると、マルチパート フォーム データで入力ストリームを使用することはできないため、iPhone からサーバーに画像を送信しようとすると、php://input ストリームが空になります。

ここで私の質問は、Oath ルールの初心者であり、そうでないものです。

入力ストリームと $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 に答える