Amazon Webservices mit OAuth nutzen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Im Beitrag Amazon Webservices mit VBA nutzen (www.access-im-unternehmen.de/634) haben wir die technischen Grundlagen dazu geliefert, wie Sie unter VBA auf die Produktdatenbank von Amazon zugreifen können. Der Beitrag Bücherverwaltung (www.access-im-unternehmen.de/633) lieferte ein praktisches Beispiel für den Einsatz dieser Technik. In der Zwischenzeit hat sich einiges getan: Amazon hat eine zusätzliche Hürde eingebaut, die den Zugriff auf den Katalog verhindert. Der vorliegende Beitrag zeigt, wie Sie Anfragen an die Amazon Webservices signieren und wieder problemlos auf die Daten zugreifen können.

An dieser Stelle sei vorab erwähnt, dass Amazon den Zugriff auf seine Webservices an die Einhaltung der Nutzungsbedingungen knüpft. Diese besagen beispielsweise, dass die Abfrage von Produktdaten das Gewinnen von Kunden zum Ziel haben sollte – etwa, indem Sie die Produkte mithilfe dieser Informationen von Ihrer eigenen Webseite aus verlinken (damit ließe sich nebenher auch noch eine kleine Provision verdienen).

Ablauf

Bevor Sie die Dienste etwa über die Beispieldatenbank nutzen können, brauchen Sie einen Developer-Account, unter dem Sie die Anfragen absetzen können.

Der Rest ist prinzipiell das simple Zusammenstellen einer REST-Abfrage des Webservices, also das Versenden einer Abfrage, die wie ein Link aufgebaut ist und entsprechende Parameter enthält, und das Empfangen und Auswerten der Antwort des Webservices im XML-Format (bei diesem Vorgang kommen Methoden der Bibliothek Microsoft XML, vx.0 zum Einsatz – bitte daher die aktuellste verfügbare Version als Verweis hinzufügen). Gegenüber der Variante aus den oben erwähnten Beiträgen von 2008 kommt nun allerdings noch ein Schritt hinzu: Sie müssen die Parameterliste, also den wesentlichen Teil der Anfrage, signieren. Bei der Signatur handelt es sich um einen SHA256-verschlüsselten HMAC, also einen Hash-basierten Nachrichten-Authentifizierungs-Code. Diesen hängen Sie als weiteren Parameter an die Liste der Parameter an. Zum Erstellen der Signatur verwenden Sie neben der Parameterliste noch den nur Ihnen und Amazon bekannten geheimen Schlüssel. Amazon kann nach dem Erhalt Ihrer Anfrage anhand der Signatur prüfen, ob diese tatsächlich mit Ihrem geheimen Schlüssel signiert wurde.

Developer-Account holen

Amazon bietet eine ganze Reihe Webservices für die verschiedensten Bereiche an, zum Beispiel Anwendungs-Hosting, Backup und Speicherung, Datenbanken und E-Commerce. Alle werden mehr oder weniger beworben – nur Informationen über die Product Advertising API, die den Zugriff auf den Produktkatalog erlaubt, sind schwer zu finden. Sie finden über den folgenden Link direkt dorthin: aws.amazon.com/associates. Direkt dort können Sie sich auch registrieren und kurz danach auf Ihren Account zugreifen. Für den Zugriff auf den Produktkatalog benötigen Sie nur zwei Dinge: Ihre Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel.

Beides erhalten Sie, wenn Sie einem Link in der Begrüßungsmail nach der Anmeldung folgen. Wenn Sie einen Bereich wie den aus Bild 1 vorfinden, sind Sie richtig.

pic002.png

Bild 2: Daten für den Zugriff auf den Webservice

Request zusammenstellen

Der Kern der hier beschriebenen Lösung ist das Zusammenstellen eines Requests und die Auswertung der im XML-Format gelieferten Antwort. Der Request sieht beispielsweise wie folgt aus (in einer Zeile):

http://ecs.amazonaws.de/onca/xml
AWSAccessKeyId=AKIAJJDXSEUYLWWOE27Q
&Operation=ItemSearch
&Power=Author%3Aminhorst
&ResponseGroup=Medium
&SearchIndex=Books
&Service=AWSECommerceService
&Timestamp=2011-09-11T10%3A37%3A55Z
&Version=2009-01-06
&Signature=2Fu1PG8ojlEK6RSodV1sTQUyLzEQ8%2FeFLWFUbSsL1so%3D

Die Funktion GetRequest aus Listing 1 erwartet drei Parameter:

Listing 1: Zusammensetzen des Requests

Public Function GetRequest(strSearch As String, intPage As Integer, strRequest As String) As Boolean
    Dim strDeveloperToken As String
    Dim strSignatureBase As String
    Dim strSignatureKey As String
    Dim strSignature As String
    Dim db As DAO.Database
    Dim strParameterliste As String
    Dim strOAuthHeader As String
    Dim objXMLHTTP As MSXML2.XMLHTTP
    Dim objxml As MSXML2.DOMDocument
    Dim I As Integer
    Dim strDomain As String
    strDeveloperToken = cDeveloperToken
    strDomain = "ecs.amazonaws.de"
    Set db = CurrentDb
    db.Execute "DELETE FROM tblParameters", dbFailOnError
    AddParameter "Service", "AWSECommerceService"
    AddParameter "Operation", "ItemSearch"
    AddParameter "SearchIndex", "Books"
    AddParameter "ResponseGroup", "Medium"
    AddParameter "Version", "2011-08-01"
    AddParameter "Timestamp", TimeStamp_Amazon
    AddParameter "Power", strSearch
    AddParameter "AssociateTag", "amisoft"
    If intPage > 1 Then
        AddParameter "ItemPage", intPage
    End If
    strParameterliste = "AWSAccessKeyId=" & cDeveloperToken & "&"
    strParameterliste = strParameterliste & GetParameters
    strSignatureBase = "GET\n" & strDomain & "\n/onca/xml\n" & strParameterliste
    strSignatureKey = "<Geheimer Schlüssel>"
    strSignature = SignRequest(strSignatureKey, strSignatureBase)
    strRequest = "http://" & strDomain & "/onca/xml" & strParameterliste & "&Signature=" _
        & URLEncode(strSignature)
    GetRequest = True
End Function
  • strSearch: Suchausdruck, zum Beispiel author:minhorst
  • intPage: Nummer der Suchergebnis-Seite
  • strRequest: Rückgabeparameter, erwartet den zusammengesetzten Request als String

Die Routine verwendet zunächst eine weitere Funktion namens AddParameter, um alle Parameter in einer Tabelle namens tblParameter zu speichern. Diese Tabelle sieht nach dem Einfügen der Parameter wie in Bild 2 aus.

pic001.png

Bild 1: Zugriffsschlüssel für die Amazon Webservices

Warum speichern wir die Parameter in einer Tabelle Nun: Zum Ermitteln der Signatur müssen Sie die Parameter in alphabetischer Reihenfolge angeben, weshalb diese vorher sortiert werden müssen. Und da wir schon mit Access arbeiten, schreiben wir die Parameter schnell in eine Tabelle und ermitteln die richtige Reihenfolge über eine entsprechend sortierte Abfrage. Die Routine legt die folgenden Parameter an:

  • Service: Zu benutzender Webservice von Amazon, hier AWSECommerceService
  • AWSAccessKeyId: Ihr öffentlicher Amazon-Schlüssel, den Sie nach der Anmeldung an die Amazon Webservices erhalten.
  • Operation: Durchzuführende Operation, hier eine Suche (ItemSearch). Sie können über den Webservice auch etwa Einkaufslisten erstellen und bearbeiten (für weitere Parameter siehe http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.htmlAPPNDX_SearchIndexValues.html).
  • SearchIndex: Die Prozedur GetRequest geht davon aus, dass Sie im Bücherbestand von Amazon suchen möchten (Books). Falls Sie eine andere Kategorie oder gar alle Kategorien durchsuchen möchten, finden Sie die übrigen Werte für den Parameter SearchIndex unter http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.htmlAPPNDX_SearchIndexValues.html.
  • ResponseGroup: Gibt an, welche Informationen Amazon zurückliefern soll, also beispielsweise nur den Titel der gefundenen Bücher et cetera. Die möglichen Angaben finden Sie unter http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.htmlAPPNDX_SearchIndexValues.html.
  • Version: Gibt die zu verwendende API-Version an. Eine Übersicht finden Sie unter http://aws.amazon.com/archives/Product-Advertising-API.
  • Timestamp: Aktueller Zeitstempel, der mit der Funktion TimeStamp_Amazon ermittelt wird.
  • Power: Der eigentliche Suchausdruck, zum Beispiel author:minhorst.
  • AssociateTag: Ihre Kennung, mit der Sie sich bei Amazon als Partner zu erkennen geben. Diese Angabe ist zwar ein Pflichtfeld, solange Sie den Webservice nur zum Durchsuchen verwenden, geben Sie hier eine beliebige Zeichenkette an – bislang funktioniert dies noch. Anderenfalls müssen Sie sich als Partner anmelden und einen regulären Wert als AssociateTag angeben: https://partnernet.amazon.de.
  • Page: Beim ersten Aufruf brauchen Sie diesen Parameter nicht zu übergeben. Gegebenenfalls liefert der Webservice jedoch nicht alle Ergebnisse mit dem ersten Response. Dann können Sie der Response die Gesamtzahl der Antwortseiten entnehmen. Um weitere Seiten einzulesen, übergeben Sie die jeweilige Seitenzahl mit dem Page-Parameter. Die Funktion GetRequest wird dann für weitere Seiten erneut aufgerufen – siehe weiter unten.

Zusammensetzen der Parameterliste

Vor der Ermittlung der Signatur fügt die Routine die zuvor in der Tabelle tblParameters gespeicherten Parameter zu einer Parameterliste zusammen. Bei den Parametern gibt es eine Ausnahme: AWSAccessKeyID muss immer als erster Parameter angegeben werden. Daher wird dieser Parameter nicht mit den übrigen Parametern in der Tabelle tblParameters gespeichert und später sortiert ausgelesen, sondern gleich in die Variable strParameterliste eingetragen.

Die Funktion GetParameters liest dann die in der Tabelle tblParameters gespeicherten Parameter aus und setzt eine entsprechende Zeichenkette zusammen. Schließlich wird dieser noch die folgende Zeichenkette vorangestellt:

GET\necs.amazonaws.de\n/onca/xml\n

Die \n-Ausdrücke stehen stellvertretend für einen Zeilenumbruch, da die gesamte Zeichenkette etwa so aussehen soll:

GET
ecs.amazonaws.de
/onca/xml
AWSAccessKeyId=AKIAJJDXSEUYLWWOE27Q&AssociateTag=amisoft&Operation=ItemSearch&Power=author%3Aminhorst&ResponseGroup=Medium&SearchIndex=Books&Service=AWSECommerceService&Timestamp=2011-09-11T13%3A27%3A50Z&Version=2011-08-01

Dieser Ausdruck wird dann von der Funktion SignRequest signiert. Das bedeutet, dass die Funktion eine Signatur erstellt und diese zurückliefert (mehr siehe weiter unten). Die Funktion SignRequest ist eine abgewandelte Variante aus einem Beispiel von der Seite http://www.vbforums.com/showpost.phps=2afdba68f461a4514d5bc9470e21765f&p=4063769&postcount=8. Sie erwartet zwei Parameter:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar