All
Filtern nach:
Wie zahle ich Cash auf mein Konto ein?
Ich brauche Hilfe bei der Kontoverifizierung
Warum kann ich nicht auf mein Konto zugreifen?
Gibt es Gebühren für das Auszahlen von Krypto?
Ich brauche Hilfe bei der Anmeldung bei meinem Konto
Bitte beachten Sie, dass die folgenden Informationen die korrekte Implementierung unseres Authentifizierungsalgorithmus voraussetzen, da sie sich mit potenziellen Eingabe- und Formatierungsfehlern befassen.
Um mehr über unseren Authentifizierungsalgorithmus zu erfahren, klicken Sie bitte HIER
Damit ein erfolgreicher privater Aufruf getätigt werden kann, muss eine HTTP-POST-Anfrage an den entsprechenden Endpunkt gesendet werden.
Diese Anfrage enthält den Header API-Sign (Signatur), der die kodierten Post_data als Teil seines Hashing-Algorithmus verwendet.
Gibt es eine Diskrepanz zwischen der im Header enthaltenen Signatur und den in der Anfrage enthaltenen POST-Daten, wird ein Fehler „Ungültiger API-Schlüssel“ zurückgegeben.
Nachfolgend finden Sie ein Beispiel für einen korrekt formulierten Aufruf, bei dem die im Authentifizierungsalgorithmus verwendeten Daten mit denen im Anfragetext übereinstimmen:
Python
#!/usr/bin/env python3
import time
import requests
import urllib.parse
import hashlib
import hmac
import base64
api_key = ''
secret_key = ''
nonce = str(int(1000 * time.time()))
# Define the URI path for the Kraken API request
uri_path = '/0/private/AddOrder'
# API URL
api_url = 'https://api.kraken.com'
# Create a dictionary for the request data
# Note that this is the data that will be used to calculate the Authentication Algorithm (API-Sign).
data = {
'nonce': nonce,
'ordertype': 'limit',
'type': 'buy',
'volume': '1',
'pair': 'btcusd',
'price': '58626.4',
'validate': True
}
# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()
# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()
# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()
# Make the POST request
# Note that the data below is what is sent in the HTTP request.
req = requests.post(api_url + uri_path, headers=headers, data={
'nonce': nonce,
'ordertype': 'limit',
'type': 'buy',
'volume': '1',
'pair': 'btcusd',
'price': '58626.4',
'validate': True
})
# Print the result
print(req.json())
# Result:
# {'error': [], 'result': {'descr': {'order': 'buy 1.00000000 XBTUSD @ limit 58626.4'}}}Werden jedoch „ordertype“ und „volume“ vertauscht, wird ein Fehler „Ungültiger Schlüssel“ erzeugt.
Python
#!/usr/bin/env python3
import time
import requests
import urllib.parse
import hashlib
import hmac
import base64
api_key = ''
secret_key = ''
nonce = str(int(1000 * time.time()))
# Define the URI path for the Kraken API request
uri_path = '/0/private/AddOrder'
# API URL
api_url = 'https://api.kraken.com'
# Create a dictionary for the request data
data = {
'nonce': nonce,
'ordertype': 'limit',
'type': 'buy',
'volume': '1',
'pair': 'btcusd',
'price': '58626.4',
'validate': True
}
# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()
# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()
# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()
# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data={
'nonce': nonce,
'volume': '1',
'type': 'buy',
'ordertype': 'limit',
'volume': '1',
'pair': 'btcusd',
'price': '58626.4',
'validate': True
})
# Print the result
print(req.json())
# Result:
# {'error': ['EAPI:Invalid key']}Ein Hinweis darauf, dass dies die Ursache für den Fehler „Ungültiger Schlüssel“ sein könnte, ist, wenn Aufrufe an Endpunkte, die keine mehreren Parameter erfordern, erfolgreich sind (Balance, OpenOrders). Wenn Sie von diesen Aufrufen kontinuierlich eine gültige Antwort erhalten, erscheint die Diskrepanztheorie plausibler.
*Bitte beachten Sie, dass im obigen Beispiel der Parameter „Validate“ verwendet wurde, der lediglich die Eingaben validiert, aber die Bestellung nicht übermittelt. Der Parameter sollte für den Live-Handel verworfen werden*
Eine Diskrepanz zwischen dem Inhaltstyp des Body und des Headers kann ebenfalls zu einem ungültigen API-Schlüssel führen.
Nachfolgend sehen Sie ein Szenario, in dem sowohl der Header als auch die Post-Daten URL-kodiert sind:
Python
api_key = ""
api_secret = base64.b64decode("")
api_domain = "https://api.kraken.com"
api_path = "/0/private/"
api_endpoint = "Balance" # {"error":[]} IS SUCCESS-EMPTY BALANCE
api_parameters = ""
api_nonce = str(int(time.time() * 1000))
api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')
api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()
api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)
api_sig = base64.b64encode(api_hmacsha512.digest())
api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)
api_request.add_header("Content-Type", "application/x-www-form-urlencoded")
api_request.add_header("API-Key", api_key)
api_request.add_header("API-Sign", api_sig)
api_request.add_header("User-Agent", "Kraken REST API")
print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)
print("")
api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()
print("API JSON DATA:")
print(api_reply)
sys.exit(0)
# Response:
# API JSON DATA:
# {"error":[],"result":{"ADA":"0.00000000","AIR":"0.0000000000","ALGO":"0.00000000","ATOM":"0.00000000",
# "AVAX":"0.0000000000","BONK":"0.24","BSX":"0.00","C98":"0.00000","CVC":"0.0000000000","DOT":"0.0000000058",
# "DYM":"1.001240","ETH2.S":"0.0000000000","FLOW":"0.0000000000","FLR":"0.0000","GRT":"0.0000000000","ICP":"0.00000000",
# "KAVA":"0.00000000","KFEE":"4619.88","KSM":"0.0457969620","KSM.S":"0.0000000000","MATIC":"0.0000000000",
# "MINA":"1.0067624751","MINA.S":"0.0000000000","PARA":"0.000","POLS":"0.00000","SBR":"0.00000000","SCRT":"0.00000000",
# "SCRT21.S":"0.00000000","SDN":"0.0000000000","SEI":"0.0000","SHIB":"0.00000","SOL":"0.0000069748","SOL.S":"0.0000000000",
# "SOL03.S":"0.0201035317","TIA":"0.000000","TRX":"0.00000000","USDC":"0.00000000","USDT":"0.00068726",
# "USDT.B":"3.53191423","WEN":"158958.59","WIF":"0.00000","XBT.M":"0.0001000103","XETH":"0.0000000000",
# "XTZ":"0.00000000","XXBT":"0.0000000000","XXDG":"24.34451185","XXMR":"0.0000000000","ZCAD":"0.0000",
# "ZEUR":"0.2732","ZUSD":"0.6353"}}Wenn wir jedoch den Inhaltstyp des Headers als JSON hinzufügen, erhalten wir einen
EAPI: Ungültiger Schlüssel-Fehler.
Python
api_key = ""
api_secret = base64.b64decode("")
api_domain = "https://api.kraken.com"
api_path = "/0/private/"
api_endpoint = "AddOrder" # {"error":[]} IS SUCCESS-EMPTY BALANCE
# api_parameters = "pair=xbtusd&ordertype=market&type=buy&volume=0.0001&validate=True"
api_parameters = ''
api_nonce = str(int(time.time() * 1000))
api_postdata = api_parameters + "&nonce=" + api_nonce
api_postdata = api_postdata.encode('utf-8')
api_sha256Data = api_nonce.encode('utf-8') + api_postdata
api_sha256 = hashlib.sha256(api_sha256Data).digest()
api_hmacSha512Data = api_path.encode('utf-8') + api_endpoint.encode('utf-8') + api_sha256
api_hmacsha512 = hmac.new(api_secret, api_hmacSha512Data, hashlib.sha512)
api_sig = base64.b64encode(api_hmacsha512.digest())
api_url = api_domain + api_path + api_endpoint
api_request = urllib2.Request(api_url, api_postdata)
print("DEBUG DATA : ")
print("api_url : " + api_url)
print("api_endpoint : " + api_endpoint)
print("api_parameters : " + api_parameters)
print("")
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = api_sig
headers['Content-Type'] = 'application/json'
headers['Accepts'] = 'application/json'
headers['User-Agent'] = "Kraken REST API"
api_reply = urllib2.urlopen(api_request).read()
api_reply = api_reply.decode()
data = {'nonce': api_nonce}
req = requests.post(api_url, headers=headers, data=data)
print(req.json())
print("API JSON DATA:")
print(api_reply)
sys.exit(0)
# API JSON DATA:
# {"error":["EAPI:Invalid key"]}*Beachten Sie, dass entweder URL-kodierte Daten oder JSON-kodierte Daten verwendet werden können, die Daten jedoch sowohl in der SHA256-Eingabe als auch in der HTTP-Anfrage exakt übereinstimmen müssen.*
Ein Fehler „Ungültiger Schlüssel“ kann auch durch die Übergabe einer unvollständigen oder fehlenden Endpunkt-URI verursacht werden (zum Beispiel „AddOrder“ anstelle von „/0/private/AddOrder“).
Damit der Authentifizierungsalgorithmus den API-Sign-Header korrekt erstellen kann, muss er die URI vollständig verwenden (zum Beispiel „/0/private/AddOrder“). Wird ein Teil dieser URI abgeschnitten, führt dies zu einem falschen Wert für API-Sign und somit zu einem Fehler „Ungültiger Schlüssel“.
Nachfolgend sehen Sie ein Beispiel, bei dem nur „AddOrder“ zur Kodierung übergeben wird, anstatt der vollständigen Endpunkt-URI „/0/private/AddOrder“
Python
api_key = ''
secret_key = ''
# Define the URI path for the Kraken API request
uri_path = 'AddOrder'
# API URL
api_url = 'https://api.kraken.com/0/private/'
# Create a dictionary for the request data
data = {
"nonce": str(int(1000 * time.time())),
"ordertype": 'limit',
'type': 'buy',
'volume': '0.07617478622420963',
'pair': 'SOLUSD',
'price': '127.47',
'validate': 'true'
}
# Encode the data for the request
postdata = urllib.parse.urlencode(data)
encoded = (str(data['nonce']) + postdata).encode()
# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()
# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()
# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data=data)
# Print the result
print(req.json())
# Result:
# {'error': ['EAPI:Invalid key']}Ein weiteres häufiges Problem, das einen Fehler „Ungültiger Schlüssel“ verursacht, ist eine Diskrepanz bei der Kodierung zwischen der POST-Anfrage und der HTTP-Authentifizierung.
Im folgenden Beispiel sind die an die POST-Anfrage übergebenen „Daten“ URL-formatiert (mit Leerzeichen als „+“ kodiert) als Inhaltstyp „application/x-www-form-urlencoded“, während „data_formatted“ Leerzeichen als „%20“ kodiert.
Obwohl in beiden Beispielen die Leerzeichen kodiert sind, sind die Daten, die an den Authentifizierungsalgorithmus und die POST-Anfrage übergeben werden, nicht exakt gleich. Dies führt zu einem Fehler „Ungültiger Schlüssel“.
Python
# Define the URI path for the Kraken API request
uri_path = '/0/private/DepositAddresses'
# API URL
api_url = 'https://api.kraken.com'
# Calculate Nonce for both data variables
nonce = str(int(1000 * time.time()))
# Create a dictionary for the request data
data = {
"nonce": nonce,
"asset": 'BTC',
'method': 'Bitcoin Lightning',
'amount': '0.2',
'new': True
}
postdata_data = urllib.parse.urlencode(data)
# Encode the data for the request manually
data_formatted = f'nonce={nonce}&asset=BTC&method=Bitcoin%20Lightning&amount=0.2&new=True'
postdata = data_formatted
encoded = (nonce + postdata).encode()
# Create a message to be signed
message = uri_path.encode() + hashlib.sha256(encoded).digest()
# Create the HMAC signature
mac = hmac.new(base64.b64decode(secret_key), message, hashlib.sha512)
sigdigest = base64.b64encode(mac.digest())
# Create headers for the request
headers = {}
headers['API-Key'] = api_key
headers['API-Sign'] = sigdigest.decode()
# Make the POST request
req = requests.post(api_url + uri_path, headers=headers, data=data)
# Print the result
print(req.json())
# Result:
# {'error': ['EAPI:Invalid key']}Um dies deutlich zu veranschaulichen, sehen Sie unten die 2 verschiedenen Formate für Daten:
Bash
data = nonce=1719929687102&asset=BTC&method=Bitcoin+Lightning&amount=0.2&new=True
data_formatted = nonce=1719929687102&asset=BTC&method=Bitcoin%20Lightning&amount=0.2&new=True*Es ist möglich, entweder Klartext oder prozentkodiert zu verwenden, solange das Format sowohl in den Authentifizierungsdaten als auch in der Anfrage dasselbe ist.*