質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

1747閲覧

あるAPIを試していますが、認証でエラーが出てしまいます。

takeshi1907

総合スコア54

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2017/10/28 14:10

編集2017/10/28 14:17

どうしても解決しないので、ご質問させていただきます。

http://techbureau-api-document.readthedocs.io/ja/latest/trade/1_common.html#id2

こちらのAPIを試しているのですが、どうしてもい以下の(signature mismatch)のエラーが帰ってきてしまいます。原因がわからないのですが、何がおかしいのでしょうか?

{
error = signature mismatch";
success = 0;
}

----以下、実際のコードです。-------------------------------

  • (void)httpRequest {
    NSError *error;
    double unixtime = [[NSDate date] timeIntervalSince1970];

    NSDictionary *parameters = @{@"nonce":[NSString stringWithFormat:@"%f",unixtime], @"method":@"get_info"};
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:&error];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];

    NSString *url = @"https://api.zaif.jp/tapi";
    NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil];
    [req setValue:@"xxxxxxxxxxxxxxxxxxx" forHTTPHeaderField:@"key"];
    [req setValue:[self sha512:jsonString withSalt:@"xxxxxxxxxxxxxxxxxx"] forHTTPHeaderField:@"sign"];

// [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
// [req setValue:@"application/json" forHTTPHeaderField:@"Accept"];
// [req setHTTPBody:[[self sha512:jsonString] dataUsingEncoding:NSUTF8StringEncoding]];
[[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
if (!error) {
NSLog(@"Reply JSON: %@", responseObject);
if ([responseObject isKindOfClass:[NSDictionary class]]) {
//blah blah
}
} else {

NSLog(@"Error: %@, %@, %@", error, response, responseObject); } }] resume];

}

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ドキュメントを読むと、

signはPOSTする全てのパラメータ(nonceとmethodおよびメソッド毎のパラメータ)を URLエンコードしたクエリ形式(param1=val1&param2=val2)のメッセージとして、Secret Keyを用いてHMAC-SHA512で署名します。

と記載があります。
提示されたコードではJSONエンコードしているのが原因の一つだと思います。

URLエンコードしたメッセージは、例えば、 NSURLComponents を利用して components.query で取得できます。

ObjectiveC

1NSURLComponents *components = [NSURLComponents componentsWithString:@"https://api.zaif.jp/tapi"]; 2NSURLQueryItem *nonce = [NSURLQueryItem queryItemWithName:@"nonce" value:@"23123"]; 3NSURLQueryItem *method = [NSURLQueryItem queryItemWithName:@"method" value:@"get_info"]; 4components.queryItems = @[ nonce, method ];

また、以下のように記載があるので、上記作成したメッセージをリクエスト Body につける必要があります。

その他のメソッド毎の固有のパラメータも全てPOSTパラメータにて送信してください。

ただ、 Body のフォーマットがこのドキュメントからは読み取れないです。

投稿2017/10/28 15:09

編集2017/10/28 15:48
ykws

総合スコア1236

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeshi1907

2017/10/28 15:41

ご回答ありがとうございます。 早速NSURLComponents を利用して以下のように書き換えて見ましたが、やはり結果は同じようでした。 他に何か原因があるのでしょうか。 - (void)httpRequest { NSError *error; double unixtime = [[NSDate date] timeIntervalSince1970]; NSURLComponents *components = [NSURLComponents componentsWithString:@"https://api.zaif.jp/tapi"]; NSURLQueryItem *nonce = [NSURLQueryItem queryItemWithName:@"nonce" value:[NSString stringWithFormat:@"%f",unixtime]]; NSURLQueryItem *method = [NSURLQueryItem queryItemWithName:@"method" value:@"get_info"]; components.queryItems = @[nonce,method]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSString *url = @"https://api.zaif.jp/tapi"; NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:url parameters:nil error:nil]; [req setValue:@"xxxxxxxxxx" forHTTPHeaderField:@"key"]; [req setValue:[self sha512:components.query withSalt:@"xxxxxxxxxx"] forHTTPHeaderField:@"sign"]; [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (!error) { NSLog(@"Reply JSON: %@", responseObject); if ([responseObject isKindOfClass:[NSDictionary class]]) { //blah blah } } else { NSLog(@"Error: %@, %@, %@", error, response, responseObject); } }] resume]; } 宜しくお願いします。
ykws

2017/10/28 15:49

POST リクエスト Body に何も渡していないのが原因だと思います。
guest

0

POST リクエスト Body に何も渡していないのが原因だと思います。

ご回答ありがとうございます。
components.queryをbodyにも渡すようにしたら無事に解決しました。
大変助かりました。

投稿2017/10/28 17:06

takeshi1907

総合スコア54

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykws

2017/10/29 04:04

Good!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問