39163
Objective-Cを使いBittrexのAPI認証をしたいと思いこちらを参考にして <https://bittrex.com/home/api>  
<https://stackoverflow.com/questions/44610874/bittrex-api-returns-apikey-not-
provided>

以下のようなコードを書きました。

```

    - (void)fetch {
    
      double unixtime = [[NSDate date] timeIntervalSince1970];
    
    
      NSURLComponents *components = [NSURLComponents componentsWithString:@"https://bittrex.com"];
      components.path = @"/api/v1.1/account/getbalances";
    
    
      NSURLQueryItem *nonce  = [NSURLQueryItem queryItemWithName:@"nonce"  value:[NSString stringWithFormat:@"%f",unixtime]];
      NSURLQueryItem *apikey = [NSURLQueryItem queryItemWithName:@"apikey" value:@"xxxxx"];
      components.queryItems = @[nonce,apikey];
      NSURL *url = [components URL];
    
    
      NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
                                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                         timeoutInterval:10.0];
    
    
    
    
      [request setHTTPMethod:@"GET"];
      [request setValue:[self sha512:components.query withSalt:@"xxxxx"] forHTTPHeaderField:@"apisign"];
      NSData *body = [components.query dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
      [request setHTTPBody:body];
    
    
    
      [[[NSURLSession sharedSession] dataTaskWithRequest:request
                                       completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    
                                         if (response && ! error) {
                                             NSLog(@"%@",  [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]);
                                         } else {
                                             NSLog(@"%@", error);
                                         }
    
                                     }] resume];
    
    
    
    
    
    }
    
```

しかしこのメッセージが返ってきてしまいます。

```

    {
        message = "APIKEY_NOT_PROVIDED";
        result = "<null>";
        success = 0;
    }
    
```

APIの認証などは今までほとんどやったことがなく困っています。どのように書いたらいいのでしょうか？
CC BY-SA 3.0
2017-10-30T06:58:43.193
39153
2017-10-31T01:34:08.567
2017-10-30T10:03:14.657
19482
19482
question
ios objective-c
NSURLSessionでの認証
[公式ドキュメント](https://bittrex.com/home/api)にあるように、apisign
ヘッダを作る際はクエリだけでなく、URLまるごとSHA512のハッシュにするようです。

つまり、

```

    [request setValue:[self sha512:components.query withSalt:@"xxxxx"] forHTTPHeaderField:@"apisign"];
    
```

ではなく、

```

    [request setValue:[self sha512:url.absoluteString withSalt:@"xxxxx"] forHTTPHeaderField:@"apisign"];
    
```

とするのが正しいです。

また、

```

    NSData *body = [components.query dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
    [request setHTTPBody:body];
    
```

の2行は不要です。
CC BY-SA 3.0
2017-10-31T01:34:08.567
39163
2017-10-31T01:34:08.567
369
39153
answer