Ik probeer de private Kraken API werkend te krijgen op iOS (ook al laat apple momenteel geen bitcoin apps toe).
GET requests voor het orderboek gaan zonder problemen. Maar ik loop nu vast bij POST request om de Balance op te vragen. Dit is wat Kraken aan vereisten geeft:
(otp, krakenApiKey en krakenSecret zijn strings met m'n one time password en kraken api en secret)
Als return data van de POST request krijg ik vervolgens een JSON met de error: "EAPI:Invalid key". Het lijkt mij sterkt dat de api key fout is want dit is gewoon een string. Ik verwacht eerder dat de fout in m'n signature zit of ergens anders. Als iemand enig idee heeft waar het fout zou kunnen gaan of wat ik kan verbeteren dan zou dat zeer welkom zijn
GET requests voor het orderboek gaan zonder problemen. Maar ik loop nu vast bij POST request om de Balance op te vragen. Dit is wat Kraken aan vereisten geeft:
Dit is de objective-c code die ik heb:API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
(otp, krakenApiKey en krakenSecret zijn strings met m'n one time password en kraken api en secret)
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
| - (void)updateBalance { NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970]; NSInteger nonce = seconds*1000; NSString *uriPath = @"/0/private/Balance"; NSString *urlString = [NSString stringWithFormat:@"%@%@", @"https://api.kraken.com", uriPath]; NSString *postString = [NSString stringWithFormat:@"nonce=%li&otp=%@", (long)nonce, otp]; NSString *apiSign = [self signatureForNonce:nonce andUriPath:uriPath andPost:postString]; NSString *krakenApiKeyString = [NSString stringWithFormat:@"%@", krakenApiKey]; NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; defaultConfigObject.HTTPAdditionalHeaders = @{ @"API-Key" : krakenApiKeyString, @"API-Sign" : apiSign }; NSURLSession *newSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; NSURLSessionDataTask * dataTask =[newSession dataTaskWithRequest:[self createRequestWithURL:urlString andPostString:postString] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { if(error == nil) { [self processKrakenBalanceData:data]; } else { NSLog(@"Error in request updating kraken balance: %@", [error description]); } }]; [dataTask resume]; } - (NSString*)signatureForNonce:(NSInteger)nonce andUriPath:(NSString*)uri andPost:(NSString*)post { NSData *secretData = [[NSData alloc] initWithBase64EncodedString:krakenSecret options:0]; NSString *sha256 = [self sha256HashFor:[NSString stringWithFormat:@"%li%@", (long)nonce, post]]; NSString *message = [NSString stringWithFormat:@"%@%@", uri, sha256]; NSData *messageData = [message dataUsingEncoding:NSUTF8StringEncoding]; NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH]; CCHmac(kCCHmacAlgSHA512, secretData.bytes, secretData.length, messageData.bytes, messageData.length, hash.mutableBytes); NSString *encodedHash = [hash base64EncodedStringWithOptions:0]; return encodedHash; } -(NSString*)sha256HashFor:(NSString*)input { const char* str = [input UTF8String]; unsigned char result[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(str, strlen(str), result); NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2]; for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++) { [ret appendFormat:@"%02x",result[i]]; } return ret; } - (NSURLRequest*)createRequestWithURL:(NSString*)urlString andPostString:(NSString*)post { NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; [request setValue:[NSString stringWithFormat:@"%li", (long)postData.length] forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; return request; } |
Als return data van de POST request krijg ik vervolgens een JSON met de error: "EAPI:Invalid key". Het lijkt mij sterkt dat de api key fout is want dit is gewoon een string. Ik verwacht eerder dat de fout in m'n signature zit of ergens anders. Als iemand enig idee heeft waar het fout zou kunnen gaan of wat ik kan verbeteren dan zou dat zeer welkom zijn