Torbjorn Zetterlund

Tue 15 2022
Image

Sådan kodes Oauth i en cloudfunktion ved hjælp af Python

by bernt & torsten

En RESTful API er et arkitektonisk design til en API (Application Program Interface), der bruger HTTP-anmodninger til at få adgang til og bruge data. OAuth er en godkendelsesprotokol, der giver dig mulighed for at godkende, at et program interagerer med et andet på dine vegne uden at give din adgangskode væk.

OAuth er en delegeret autorisationsstruktur, der gør det muligt for apps at få begrænset adgang (omfang) til en brugers data uden at give en brugers adgangskode væk. Det afkobler godkendelse fra godkendelse og understøtter flere use cases, der adresserer forskellige enhedsfunktioner.

Den grundlæggende autentificering for RestFul API’er ligner koden eksempel nedenfor, koden er skabt med Python og bruger Google Secrets Manager til at skjule hemmelighederne.

Grundlæggende godkendelse

    # Installer Google Libary
    fra google.cloud importere secretmanager
    
Få hemmeligheden til Token
    token = _getsecrets("token")

# Få hemmeligheden for Company ID
    _getsecrets("company_id")

# Opret de kodede godkendelsesparametre
    auth = companyid + ':' + token
    encoded_u = base64.b64encode(auth.encode()).afkode()

# Opret sidehovedet og URL-adressen
    overskrifter = {
        "Autorisation" : "Basis %s" % encoded_u
    }

Kodestykket læser hemmelighederne og fra hemmelighederne oprette og kode den godkendelse, der bruges i overskriften. Opsætning af URL-adressen, og kald funktionen _requestandstore med URL-adresse og header.

    url = 'https://api.test.com/v1/users'
    _requestandstore(url, headere)        

Den funktion, der gør anmodningen, URL-anmodningen er ligetil ved at medtage detaljerne i overskrifterne for request.get

def _requestandstore(url, header):
    forsøge:
        # Lav en anmodning
        response = requests.get(url, params={'page': 1, 'per_page': 10}, headers=header)

Følgende kodestykke funktioner er for at få hemmelighederne fra Google CLoud Secrets manager.
def _getsecrets(secret_name):
    resource_name = f"projekter/{project_id}/secrets/{secret_name}/versions/latest"
    forsøge:
        svar = client.access_secret_version(request={"name": resource_name})
        return response.payload.data.decode('UTF-8')
    undtagen:
        returnere Falsk

Oauth-godkendelse

OAuth (Open Authorization) er en åben standard for adgang til et program for brugere af det pågældende program for at give websteder eller programmer adgang til deres oplysninger på andre websteder, men uden at give dem adgangskoderne. Når en bruger bruger Oauth på et websted, vises en samtykkeskærm, så brugerne kan give deres tilladelse.

En skyfunktion, der kører på en serverløs server, har ikke en brugergrænseflade, der giver brugerne mulighed for at give dette samtykke, i den næste del her vil jeg forklare, hvordan vi bruger OAuth i en cloud-funktion.

Før jeg går videre jeg gerne nævne, at følgende kode fungerer godt i brugerdefinerede RestFul API Oauth, hvis du vil bruge en Google API – du måske ønsker at læse Datapipeline youtube analytics til BigQuery med Airbyte , hvor jeg skrev om, hvordan du kan få det gjort med Google OAuth.

Falsk Oauth-login

For at vi kan bruge OAuth i en cloud-funktion, skal vi lave et falsk OAuth-login, så vi kan få adgangstokenet, dette gøres ved at foretage en ugyldig anmodning. Hvis redirect_uri er ugyldig, stopper browseren omdirigeringen og viser godkendelseskoden.

Her er koden – først skal vi få vores klient-id, klienthemmelighed og token_url, disse oplysninger leveres af den tjenesteudbyder, du forsøger at oprette forbindelse til.

Det næste skridt er at indstille grant_type og foretage en RestFUL API-indlæg anmodning om at få adgang token.

    # Få hemmeligheden for Client ID
    client_id = _getsecrets("client_id")

# Få hemmeligheden for Client Secret
    client_secret = _getsecrets("client_secret")

# Få hemmeligheden for Token URL
    token_url = _getsecrets("token_url")

# Fake Oauth login for at få en adgang token ved at gøre en ugyldig anmodning, Hvis redirect_uri er ugyldig,
    # browseren vil stoppe omdirigering og vise autorisationskoden.
    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)

# Opret sidehovedet og URL-adressen
    overskrifter = {
        »Tilladelse«: »Bærer« + tokens['access_token']
    }

Når du har adgangstokenet, angiver du din RestFUL API-URL med slutpunkt og foretager et Afslappende API-kald.
    url = 'https://api.test.com/api/v2/users'
    _requestandstore(filnavn, URL, headere)

def _requestandstore(filnavn, URL, header):
    forsøge:
        # Lav en anmodning til API
        response = requests.get(url, params={'page': 1, 'perPage': 400}, headers=header, verify=False)
 

Det er det, dette bør arbejde i de fleste scenarier – og rådgivning er at tale med den tjenesteudbyder, du forsøger at forbinde med for at finde ud af detaljerne.

Use Cases

For at nævne er der flere use cases, hvor du vil bruge en cloudfunktion til at få adgang til et tjenesteudbydereprogram. Jeg vil nævne et par, kan du have mere, så kan du kommentere nedenfor.

  • Udtræk af data fra tjenesteudbyder til Data Warehosue, der skal bruges til Analytics
  • Social Media udvinding af data til Data Warehosue, der skal bruges til Analytics
  • Online Media-udvinding af data til Data Warehosue, der skal bruges til Analytics

Share: