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!
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
@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
@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