
So codieren Sie Oauth in einer Cloud-Funktion mit Python
by bernt & torsten
Eine RESTful-API ist ein Architekturentwurf für eine Anwendungsprogrammschnittstelle (API), die HTTP-Anforderungen für den Zugriff auf und die Verwendung von Daten verwendet. OAuth ist ein Authentifizierungsprotokoll, mit dem Sie die Interaktion einer Anwendung mit einer anderen in Ihrem Namen genehmigen können, ohne Ihr Kennwort preiszugeben.
OAuth ist ein delegiertes Autorisierungsframework, das es Apps ermöglicht, eingeschränkten Zugriff (Bereiche) auf die Daten eines Benutzers zu erhalten, ohne das Kennwort eines Benutzers preiszugeben. Es entkoppelt die Authentifizierung von der Autorisierung und unterstützt mehrere Anwendungsfälle, die sich mit unterschiedlichen Gerätefunktionen befassen.
Die grundlegende Authentifizierung für RestFul-APIs sieht in etwa wie das Codebeispiel unten aus, der Code wird mit Python erstellt und verwendet Google Secrets Manager, um die Geheimnisse zu verbergen.
Grundlegende Authentifizierung
# Install Google Libary
from google.cloud import secretmanager
# Get the secret for Token
token = _getsecrets("token")
# Get the secret for Company ID
companyid = _getsecrets("company_id")
# Create the encoded authentication parameters
auth = companyid + ':' + token
encoded_u = base64.b64encode(auth.encode()).decode()
# Create the Header and url
headers = {
"Authorization" : "Basic %s" % encoded_u
}
Der Codeausschnitt liest die geheimen Schlüssel und erstellt und codiert aus den geheimen Schlüsseln die Authentifizierung, die im Header verwendet wird. Einrichten der URL und Aufruf der Funktion _requestandstore mit URL und Header.
url = 'https://api.test.com/v1/users'
_requestandstore(url, headers)
Die Funktion, die die Anforderung, die URL-Anforderung, erstellt, ist einfach, indem sie die Details der Header für die Anforderung enthält.get
def _requestandstore(url, header):
try:
# Make a request
response = requests.get(url, params={'page': 1, 'per_page': 10}, headers=header)
Die folgenden Code-Snippet-Funktionen dienen zum Abrufen der Geheimnisse aus dem Google CLoud Secrets-Manager.
def _getsecrets(secret_name):
resource_name = f"projects/{project_id}/secrets/{secret_name}/versions/latest"
try:
response = client.access_secret_version(request={"name": resource_name})
return response.payload.data.decode('UTF-8')
except:
return False
Oauth-Authentifizierung
OAuth (Open Authorization) ist ein offener Standard für den Zugriff auf eine Anwendung für Benutzer dieser Anwendung, um Websites oder Anwendungen Zugriff auf ihre Informationen auf anderen Websites zu gewähren, ohne ihnen jedoch die Passwörter zu geben. Wenn ein Benutzer Oauth auf einer Website verwendet, wird ein Zustimmungsbildschirm angezeigt, damit die Benutzer ihre Erlaubnis erteilen können.
Eine Cloud-Funktion, die auf einem serverlosen Server ausgeführt wird, hat keine Benutzeroberfläche, die es den Benutzern ermöglicht, diese Zustimmung zu erteilen, im nächsten Teil werde ich erklären, wie wir OAuth in einer Cloud-Funktion verwenden.
Bevor ich weiter gehe, möchte ich erwähnen, dass der folgende Code gut in benutzerdefinierter RestFul API Oauth funktioniert, wenn Sie eine Google API verwenden – Vielleicht möchten Sie Datapipeline Youtube Analytics zu BigQuery mit Airbyte lesen, in dem ich geschrieben habe, wie Sie es mit Google OAuth erledigen können.
Gefälschtes Oauth-Login
Damit wir OAuth in einer Cloud-Funktion verwenden können, müssen wir ein gefälschtes OAuth-Login durchführen, damit wir das Zugriffstoken erhalten können, indem wir eine ungültige Anfrage stellen. Wenn die redirect_uri ungültig ist, stoppt der Browser die Weiterleitung und zeigt den Autorisierungscode an.
Hier ist der Code – zuerst müssen wir unsere Client-ID, client secret und token_url erhalten, diese Informationen werden von dem Dienstanbieter bereitgestellt, mit dem Sie versuchen, eine Verbindung herzustellen.
Der nächste Schritt besteht darin, die grant_type festzulegen und eine RestFUL-API-Post-Anforderung zu stellen, um das Zugriffstoken abzurufen.
# Get the secret for Client ID
client_id = _getsecrets("client_id")
# Get the secret for Client Secret
client_secret = _getsecrets("client_secret")
# Get the secret for Token URL
token_url = _getsecrets("token_url")
# Fake Oauth login to get an access token by making an invalid request, If the redirect_uri is invalid,
# the browser will stop the redirect and show the authorization code.
data = {'grant_type': 'client_credentials'}
access_token_response = requests.post(token_url, data=data, verify=False, allow_redirects=False, auth=(client_id, client_secret))
tokens = json.loads(access_token_response.text)
# Create the Header and url
headers = {
'Authorization': 'Bearer ' + tokens['access_token']
}
Wenn Sie über das Zugriffstoken verfügen, legen Sie Ihre RestFUL-API-URL mit Endpunkt fest und führen einen RestFul-API-Aufruf durch.
url = 'https://api.test.com/api/v2/users'
_requestandstore(filename, url, headers)
def _requestandstore(filename, url, header):
try:
# Make a request to API
response = requests.get(url, params={'page': 1, 'perPage': 400}, headers=header, verify=False)
Das ist es, dies sollte in den meisten Szenarien funktionieren – und der Rat ist, mit dem Dienstanbieter zu sprechen, mit dem Sie versuchen, sich zu verbinden, um die Details herauszufinden.
Verwendung von Fällen
Zu erwähnen ist, dass es mehrere Anwendungsfälle gibt, in denen Sie eine Cloud-Funktion verwenden möchten, um Zugriff auf eine Service-Provider-Anwendung zu erhalten. Ich werde ein paar erwähnen, Sie haben vielleicht mehr, also kommentieren Sie bitte unten.
- Service Provider Extraktion von Daten in Data Warehosue zur Verwendung für Analytics
- Social-Media-Extraktion von Daten in Data Warehosue zur Verwendung für Analytics
- Online-Medienextraktion von Daten in Data Warehosue zur Verwendung für Analytics

Tech Disillusionment
For four decades, I have worked in the tech industry. I started in the 1980s when computing...

A Poem: The Consultant's Message
On a Friday, cold and gray,
The message came, sharp as steel,
Not from those we...

Using AI to Plan Wall Repair and Gutter Installation
In this article, I will share my experience using AI to plan the work required to fix a wall...