So codieren Sie Oauth in einer Cloud-Funktion mit Python

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

Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *