2016-05-12 8 views
0

Ich schreibe eine App mit Python und Flask, die ich auf einer virtuellen Maschine von Google Compute Engine bereitstellen möchte. Diese App muss eine GET-Anfrage für eine API stellen, die ein Token benötigt, das einer IP-Adresse zugeordnet ist, dh die API autorisiert nur Anfragen, die von den zuvor bereitgestellten IP-Adressen stammen - und dies ist der einzige Grund, den ich verwende GCE, da ich eine statische IP für sie festlegen kann, aber nicht für App Engine.GET-Anfrage von Google Compute Engine für eine API, die eine feste IP erfordert, wird abgelehnt - warum?

Der Code, den ich für die Anforderung verwenden ist folgende:

import urllib2 
import logging 

TOKEN = 'Bearer <API token>' 
URL = 'https://api.clashofclans.com/v1/leagues' 
HEADERS = {'Accept': 'application/json', 'authorization': TOKEN} 

req = urllib2.Request(URL, headers=HEADERS) 
response = urllib2.urlopen(req).read() 
logging.info(response) 
return response 

Wenn ich den Code in meinem lokalen Rechner zu testen, es funktioniert gut, aber wenn ich es auf der VM GCE laden, kann ich nur Erhalte den HTTP-Fehler 403, den Fehler, den ich bekommen würde, wenn ich versuche, eine Anfrage von einer nicht autorisierten IP-Adresse zu stellen. Allerdings habe ich die externe statische IP-Adresse der VM und das damit verknüpfte Token dreifach überprüft: Ich verwende die richtigen für die Anfrage.

Meine aktuellen Firewall-Regeln sind die folgenden und ich bin mir nicht sicher, ob sie mit dem Problem in Verbindung stehen oder nicht.

Name     Source tag Allowed protocols  Target tags   Network 
         IP range  ports 
         Subnetworks 
default-allow-http  0.0.0.0/0  tcp:80,8080  http-server   default 
default-allow-https  0.0.0.0/0  tcp:443   https-server   default 
default-allow-icmp  0.0.0.0/0  icmp    Apply to all targets default 
default-allow-internal 10.128.0.0/9 tcp:0-65535,  Apply to all targets default 
             udp:0-65535,  
             icmp    
default-allow-rdp  0.0.0.0/0  tcp:3389   Apply to all targets default 
default-allow-ssh  0.0.0.0/0  tcp:22    Apply to all targets default 

Ich weiß nicht, was könnte dies verursachen, und ich hoffe, jemand kann mir helfen, eine Lösung zu finden. Vielen Dank!

+0

Wie autorisieren Sie die API-Anfrage von GCE-Instanz (Dienstkonto)? Weitere Informationen zur Autorisierungsanfrage finden Sie unter [this link] (https://cloud.google.com/compute/docs/api/how-tos/authorisation) – Faizan

+0

@Faizan: Es tut mir leid, es ist das erste Mal, dass ich bin Verwenden von Compute Engine und ich verstehe nicht, warum mein Problem mit der Compute Engine-API zusammenhängt. Vielleicht haben Sie mein Problem falsch verstanden oder ich erkläre es nicht gut genug - oder ich habe einfach nicht verstanden, wie man Compute Engine von Anfang an einsetzt. Ich stelle eine Anfrage an die Clash of Clans-API unter https://api.clashofclans.com von einem Programm aus, das auf einer Compute Engine-Instanz ausgeführt wird. War es das, was du verstanden hast? – Tom

+0

@Tom, hast du es über den curl-Befehl von GCE VM ausprobiert? funktioniert es? curl -X GET --header "Akzeptieren: application/json" --header "autorisierung: Bearer " "https://api.clashofclans.com/v1/leagues" – Kamran

Antwort

0

Diese Frage ist ziemlich alt, aber ich erinnere mich, dass das Problem eine Woche nach Kamrans Antwort auf mysteriöse Weise gelöst wurde. Ich habe vergessen, zu diesem Zeitpunkt zu erzählen.

Ich habe nicht gefunden, was das Problem verursacht, aber es spielt keine Rolle mehr, da es nie wieder passiert ist.

1

Es scheint, dass die Bearer auf der Vorderseite Ihres API-Schlüssels fehlt. Erstellen Sie einen Schlüssel für die externe IP-Adresse Ihrer GCE-VM und versuchen Sie den folgenden Code auf Ihrer VM. Es hat für mich funktioniert.

+0

Hallo @Kamran, eigentlich benutze ich 'Bearer' davor. Ich habe den Code bearbeitet, um ihn korrekt anzuzeigen. Vielen Dank! – Tom

+0

Was bekommen Sie als Antwort? – Kamran