Signatur generieren

Hallo,

ich habe Probleme beim erzeugen der Signatur, es erscheint immer die Meldung, dass die Signatur oder der ApiKey falsch ist.

Folgendermaßen sieht die URL aus:

…api/v1/users//designs?sessionId=39f3f3f9-931c-409e-852b-b430d7d8eaad&apiKey=&sig=9b715b97a59de7cb56c68cd72166f1ef49234ba5

Aus dem folgenden string erzeuge ich meinen SHA1:

POST…api/v1/users//designs 2018-05-10T14:39:56.7664735+02:00

Ich bekomme den gleichen Hash wie auf dieser Seite: https://developer.spreadshirt.net/display/API/Security

Kann also nicht an der Methode liegen, nur bin ich nicht sicher, einmal wird die Zeit mit reingenommen zum Hashen und ein anderes Mal wieder nicht. Was ist richtig und was mache ich falsch?

Ist übrigens eine C# Anwendung

Hi,

auf jeden Fall schon mal immer den useragent mitschicken und einen timestamp anstatt deines genutzten Datumsformats. Zudem sollte der Secret mit im hash sein.

Für den Zugriff auf /user solltest du vorher noch eine Session anlegen, falls noch nicht geschehen.

Ein Beispiel in Python:

Zum Verständnis die Funktion time liefert den Unix timestamp.

P.s. Fertige Bulk-uploader in PHP (als webservice u.a.) habe ich sonst auch :wink:
P.s.s. Du entwickelst auf der alten api, nächstes Jahr soll eine neue kommen, soweit ich gelesen habe. Einige Funktionen funktionieren jetzt schon nicht mehr für den neuen Partnerbereich (Produkterstellung,…). Im alten Partnerbereich läuft die api noch komplett.

Gruß
Thimo

1 Like

Danke für die Antwort, es klappt leider trotzdem nicht. Wann müssen welche Parameter gehasht werden?
Wie gesagt, wird in diesem offiziellen Beispiel, der Zeitstempel nicht mit gehasht: https://developer.spreadshirt.net/display/API/Security

Folgendermaßen sieht meine URL aus, die immer die gleiche Meldung ausgibt:

https://api.spreadshirt.com/api/v1/users/115417255/designs?sessionId=cd26a895-8dc1-4e56-ad51-ed589f6021ec&apiKey=&sig=d3f85373bf93c61289d462f234637cdfd0c6f531

Der Hashwert wird aus dem folgenden String zusammengebaut:

GET h ttps://api.spreadshirt.net/api/v1/users/115417255/designs 1526150001

Ich probiere das momentan manuell aus und gebe das in den Browser ein, damit sollte User Agent vorhanden sein. Anonsten habe ich mir dein Beispiel in Phyton angeschaut und es exakt so nachgebaut, leider gehts trotzdem nicht.

Folgendes:

  1. Unix timestamp * 1000
  2. method + ’ ’ + url + ’ ’ + time + ’ ’ + API-Secret
  3. User-Agent in dem entsprechenden Format (nicht Browser…)

Die Url-Parameter brauchst du nicht mehr, wenn du den korrekten authorization header mitschickst. Sowieso sollten diese Parameter nicht in der URL auftauchen :slight_smile:

Versuche dich weniger an die API-Dokumentation zu halten, als am Python Skript von mir. Das ist aktueller als die API-Dokumentation und enthält schon die neuesten Änderungen der API.

Ich kann jetzt kein C#, aber wenn du es, so wie das Python Skript gemacht hast und diese Version als Pastbin posten könntest, kann ich es mir anschauen.

Gruß
Thimo

1 Like

Ich wollte das erstmal zum laufen kriegen und es dann vernünftig implementieren :smiley:
Warum wird die Doku nicht als deprecated markiert und wo finde ich die aktuelle Doku?

Hier mein Code, es geht hier erstmal nur um die Signatur:

Die Doku ist in dem Teil aktuell - einiges ist deprecated (URL Parameter), aber wie gesagt, vieles wurde in den Blogs geschrieben. Mein o.g. Python-Code ist damit komplettiert worden (wie auch meine anderen PHP Skripte).

Sofern unter SecurityRessources.getSecretKey() dein Spreadshirt API-Secret hinterlegt ist und über HashString ein korrekter SHA1 generiert wird (z.b. http://www.sha1-online.com), sollte die sig richtig sein. Die sig ist aber nur ein kleiner Teil der kompletten Authentifizierung und kann meines Wissens nicht alleine getestet werden.

So sollte der Auth. Header aussehen, um auf deine User-Designs zuzugreifen:
Authorization: SprdAuth apiKey="<apikey>", data="<method> <url> <time>", sig="SHA1(<method> <url> <time> <secret>)", sessionId="<sessionId>"

Wenn du das so hast, dann noch den User-Agent so übertragen:
Test/1.0 (http://www.xxx.de; username@email.de)

Baue dir am besten ein CURL Beispiel mit Header (Auth und User-Agent) und teste es daran.

Sollte damit beantwortet sein :wink:

Wenn du diesen Bereich deines Codes nicht öffentlich machen willst, kannst mir auch gern eine Nachricht schicken, dann schaue ich es mir so an.

1 Like

Danke für deine Hilfe, ich bin leider nicht weitergekommen. Er sagt mir jedes mal, dass mein Api-Key oder die Signatur ungültig ist. Langsam glaube ich wirklich das mein ApiKey ungültig ist.

Bin umgestiegen auf diese drei Seiten damit das testen schneller geht:

http://www.sha1-online.com/
https://www.gaijin.at/olsutc.php

Auf dieser Seite (unter Preliminaries, Punkt 2) wird gesagt, man solle den ApiKey für Design-Uploads konfigurieren. Was genau bedeutet es und wie mache ich das?

https://developer.spreadshirt.net/display/API/Uploading+Designs+to+Spreadshirt+using+Spreadshirt+API+v1

Jeder api key sollte das bereits können. Alle aktuellen - deiner wird sicherlich nicht so alt sein.
Aber kannst gerne an partner@ schicken und deinen key testen (neu erstellen) lassen.
Hast du deine Daten mal in das Python Skript gepackt? Funktioniert es damit?

Wenn ja, dann alles top und wir sollten uns deinen Code anschauen. Wenn nein, dann api key neu generieren lassen.

Wie gesagt, ich helfe dir da gerne weiter, aber langsam muss ich da etwas sehen, um dir weiterhelfen zu können :slight_smile:

1 Like

Ich Idiot bin da gar nicht drauf gekommen dein Script auszuprobieren :smiley: Damit funktioniert es, muss mal schauen was ich falsch mache.

1 Like

Ok nun gibt es die Meldung ich solle eine gültige Session liefern. Meine Session wird nachdem Login erstellt und diese verwende ich auch, kann also nicht abgelaufen sein. So siehts aus:

Auf den ersten Blick fehlen die Kommata im authString.

So sieht mein Header nun aus:

Authorization: SprdAuth apiKey=“xxx”, data=“GET https://api.spreadshirt.net/api/v1/users/115417255/designs 1526545741000”, sig=“d724c4dbca17722549c8c1394b42b8cccd5d5137”, sessionId=“cd13fa6d-488b-42a9-b1ba-4653371452c4”, User-Agent: Python-test/1.0 (w ww.test.d e; test@test.d e), Content-Type: application/xml

Jetzt dürfte alles drin sein, trotzdem ist die sessionId ungültig.

Ich verstehe kein Wort :smiley:

1 Like

Ich glaube dein Header ist noch nicht korrekt, kommst du an den generierten Header dran und könntest den mal posten? Im Python, und deswegen meine ich die Kommata sind falsch, sieht es so aus:

{'User-Agent': 'Python-test/1.0 (http://www.spreadplugin.de; thimo@grauerholz.de)', 'Authorization': 'SprdAuth apiKey="XXX", data="GET https://api.spreadshirt.net/api/v1/users/XXX/designs 1526549406000", sig="XXX", sessionId="XXX"', 'Content-Type': 'application/xml'}

Du siehst das User-Agent und Content-Type nicht teil des Authorization-Teils sind. Also SprdAuth apiKey="XXX", data="GET https://api.spreadshirt.net/api/v1/users/XXX/designs 1526549406000", sig="XXX", sessionId="XXX" ist ein kompletter String.

1 Like

Du nun wieder :wink:

hab den mal mit fiddler rausgesucht, so siehts aus bei mir:

User-Agent: User-Agent…? Ist bei Auth usw auch so

1 Like

Okay da ist der Fehler :smiley:

Bei der Methode “AddHeader” konnte ich den Namen übergeben, beim Debuggen stand da aber User Agent =, auch bei Authorization war das Gleichheitszeichen. Dann hab ich halt angefangen den Doppelpunkt da reinzupfuschen, deswegen ist der Name doppelt drin. Fiddler hat mir dann aber den “echten” Header angezeigt.

Beim User Agent ist das nicht schlimm aber bei dem Authentikator hab ich das rausgenommen und es funktioniert jetzt :smiley:

Danke lovetee nochmal für die Hilfe!

1 Like