Inhalte aufrufen

Profilbild

"401 - nicht authorisiert" über webAPI SmartStore 2.6


  • Bitte melden Sie sich an, um eine Antwort zu verfassen.
5 Antworten zu diesem Thema

#1 GoaFeeling

GoaFeeling

    Advanced Member

  • Members
  • 50 Beiträge

Geschrieben: 30 May 2017 - 15:29

Hallo zusammen,

 

anhand der Code Examples der webAPI Dokumentation habe ich versucht die Aufträge aus meinem Shop abzufragen. Dazu habe ich das webAPI PlugIn installiert und einen user mit Admin-Rechten für die webAPI freigeschaltet. Grundsätzlich scheint die Kommunikation zu funktionieren, da ich die Fehlermeldung 401 zurück erhalte.

 

Allerdings kann ich den Grund für die fehlerhafte Authorisierung nicht finden. Selbst wenn ich die Prüfungen MD5 und Timestamp aus der PlugIn-Konfiguration herausnehme, bekomme ich diese Fehlermeldung.

 

Public Key und Secret Key stimmen aber - das habe ich bereits mehrmals geprüft.

 

Die Option "unauthorisierte Zufgriffe speichern" ist aktiviert, allerdings finde ich das Log nicht, kann also den Fehler nicht weiter eingrenzen.

 

Was kann/muss ich noch prüfen? Woran könnte es liegen?

 

Vielen Dank vorab.



#2 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3034 Beiträge

Geschrieben: 30 May 2017 - 16:28

Im Fall 401 geben die Antwort-Header SmartStore-Net-Api-HmacResultId und SmartStore-Net-Api-HmacResultDesc über den genauen Grund für die Ablehnung Auskunft. Die Logs sind wie gewohnt unter System > Ereignisse aufgeführt.

Schöne Grüße aus Düsseldorf,
Marcus Gesing


#3 GoaFeeling

GoaFeeling

    Advanced Member

  • Members
  • 50 Beiträge

Geschrieben: 30 May 2017 - 17:24

ok, genauer Grund gefunden - "Invalid Signature". Deutet das auf fehlerhafte Key-Kombination hin oder auf fehlerhaft kalkulierten "SmNetHmac1"? Kann man das daraus erkennen?

 

(Die Funktion CreateSignatur habe ich aus der Doku übernommen)

 

public string CreateSignature(string secretKey, string messageRepresentation)
{
    if (string.IsNullOrWhiteSpace(secretKey) || string.IsNullOrWhiteSpace(messageRepresentation))
        return "";
    
    string signature;
    var secretBytes = Encoding.UTF8.GetBytes(secretKey);
    var valueBytes = Encoding.UTF8.GetBytes(messageRepresentation);
    
    using (var hmac = new HMACSHA256(secretBytes))
    {
        var hash = hmac.ComputeHash(valueBytes);
        signature = Convert.ToBase64String(hash);
    }
    return signature;
}


#4 GoaFeeling

GoaFeeling

    Advanced Member

  • Members
  • 50 Beiträge

Geschrieben: 30 May 2017 - 17:28

result-id ist "4"



#5 Marcus Gesing

Marcus Gesing

    SmartStore AG

  • Administrators
  • 3034 Beiträge

Geschrieben: 30 May 2017 - 18:06

An CreateSignature liegt's nicht, die wird exakt so auch in .NET verwendet. Wenn der Secret-Key korrekt ist, wird's an der Message Representation liegen, also dem, was CreateSignature verschlüsselt.
 
Hilfreich hinsichtlich Ursachenfindung könnte der API Test Client sein.

Schöne Grüße aus Düsseldorf,
Marcus Gesing


#6 GoaFeeling

GoaFeeling

    Advanced Member

  • Members
  • 50 Beiträge

Geschrieben: 31 May 2017 - 16:15

Alles klar, Fehler gefunden. Ich hatte eine Funktion GetTimestamp() erstellt, um den Timestamp abzuholen. Natürlich muss die MessageRepresentation den gleichen Timestamp enthalten wie der Header. Da ich aber jeweils GetTimestamp() aufgerufen hatte, unterschieden sich die Millisekunden der Timestamps. Nun wird nur noch einmal GetTimestamp() aufgerufen und der Wert sowohl für die MessageRepresentation als auch den Header verwendet. Works fine... :-)