Heute ein kurzes Beispiel, wie man mit VBA eine OAuth-Signatur erstellt, um z. B. via Mircosoft Word, Excel oder Access auf Facebook, Twitter oder Google-Dienste zugreifen zu können (Details siehe auch meine Tutorials zu VBA und Social Networks). Folgendes Beispiel ist auch auf älteren Office-Versionen (getestet ab 2007) lauffähig.
Zum Test verwende ich die Daten eines Beispiels der offiziellen OAuth-Seite – dieses Beispiel ist in der Doku zu OAuth 1.0A zu finden, aber in diesem Punkt hat sich zu OAuth 2.0 nichts geändert.
Die Methode EncodeBase64() habe ich größtenteils von diesem Artikel bei Stackoverflow übernommen. Die Methode UrlEncode() ist nur eine kleine Lösung, für diverse komplexere Methoden empfehle ich diesen Aritkel (ebenfalls bei Stackoverflow).
Private Sub Befehl_Click() ' Daten aus folgenden OAuth-Example: ' http://oauth.net/core/1.0a/#sig_base_example Dim oauthSecret As String oauthSecret = "kd94hf93k423kf44" Dim oauthTokenSecret As String oauthTokenSecret = "pfkkdhi9sl3r4s00" Dim requestMethod As String requestMethod = "GET" Dim uri As String uri = "http://photos.example.net/photos" Dim params As String params = "file=vacation.jpg" params = params & "&oauth_consumer_key=dpf43f3p2l4k3l03" params = params & "&oauth_nonce=kllo9940pd9333jh" 'Tipp - so könnte man eine 15-stellige Nonce erstellen: 'nonce = Int((999999999999999# - 100000000000000# + 1) _ ' * Rnd + 100000000000000#) params = params & "&oauth_signature_method=HMAC-SHA1" params = params & "&oauth_timestamp=1191242096" 'Tipp - eine Timestamp lässt sich in VBA so generien: 'zeitstempel = DateDiff("S", "1/1/1970", Now()) 'zeitstempel = Replace(Zeitstempel, " ", "") params = params & "&oauth_token=nnch734d00sl2jdk" params = params & "&oauth_version=1.0" params = params & "&size=original" 'Base URL bauen - die muss signiert werden Dim uriEnc As String uriEnc = UrlEncode(uri) Dim paramsEnc As String paramsEnc = UrlEncode(params) Dim baseUrl As String baseUrl = requestMethod & "&" & uriEnc & "&" & paramsEnc Debug.Print ("BASE URL : " & baseUrl) ' Signatur erstellen Dim asc As Object, enc As Object Dim tmpTextToHash() As Byte Dim tmpSharedSecretKey() As Byte Set asc = CreateObject("System.Text.UTF8Encoding") Set enc = CreateObject("System.Security.Cryptography.HMACSHA1") tmpTextToHash = asc.Getbytes_4(baseUrl) tmpSharedSecretKey = asc.Getbytes_4(oauthSecret & _ "&" & oauthTokenSecret) enc.Key = tmpSharedSecretKey Dim byteSignature() As Byte byteSignature = enc.ComputeHash_2(tmpTextToHash) signatur = EncodeBase64(byteSignature) Debug.Print ("SIGNATUR : " & signatur) If signatur = "tR3+Ty81lMeYAr/Fid0kMTYa/WM=" Then Debug.Print ("Signatur korrekt.") Else Debug.Print ("Signatur NICHT korrekt!") End If End Sub Function EncodeBase64(arrData() As Byte) As String ' Diese Methode ist inspiriert von einem Artikel ' in Stackoverflow - Link siehe oben! Dim objXML As MSXML2.DOMDocument Dim objNode As MSXML2.IXMLDOMElement Set objXML = New MSXML2.DOMDocument Set objNode = objXML.createElement("b64") objNode.DataType = "bin.base64" objNode.nodeTypedValue = arrData EncodeBase64 = objNode.Text Set objNode = Nothing Set objXML = Nothing End Function Function UrlEncode(strToEncode As String) As String ' eine built-in Funktion gibt es erst ab Excel 2013 ' hier eine Mini-Lösung, die nicht alle Sonderzeichen ' und Umlaute abdeckt - koplexere Lösungen siehe ' Link oben im Text! strToEncode = Replace(strToEncode, "/", "%2F") strToEncode = Replace(strToEncode, "=", "%3D") strToEncode = Replace(strToEncode, ":", "%3A") strToEncode = Replace(strToEncode, "&", "%26") UrlEncode = strToEncode End Function
Nícht vergessen: Verweis zu „Microsoft XML“ hinzufügen (Im Menu „Extras“, dann „Verweise..“, mind. Version 2).
P.S.
Probleme? Fragen? Anregungen? Ich helfe jederzeit und gerne – einfach einen Kommentar oder Mail schreiben, die Antwort kommt schnellstmöglich. Unternehmen, die Unterstützung, Beratung oder Schulung bei der API- oder Webprogrammierung, der Social-Media-Entwicklung oder dem Social-Media-Management benötigen finden zudem entsprechende Angebote meiner Firma auf der Website www.Frank-IT-Beratung.de