Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Kraken API iOS

Pagina: 1
Acties:

  • pposthoorn
  • Registratie: Januari 2005
  • Laatst online: 22-11 09:11

pposthoorn

Constructeur

Topicstarter
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:
API-Key = API key
API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
Dit is de objective-c code die ik heb:

(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 :)

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 22-11 18:42

Rannasha

Does not compute.

Mijn ervaring is dat de foutmeldingen die de API uitspuugt redelijk accuraat zijn. Als hij "Invalid key" zegt, dan is dat waarschijnlijk zo. Bij een foute signature krijg je een andere error terug.

|| Vierkant voor Wiskunde ||


  • pposthoorn
  • Registratie: Januari 2005
  • Laatst online: 22-11 09:11

pposthoorn

Constructeur

Topicstarter
Oke dan is de vraag wat er mis is met mijn key. Ik stuur nu gewoon direct de NSString. Zou ik hem misschien moeten encoden in UTF8 of ASCII oid?