
Slik koder du Oauth i en skyfunksjon ved hjelp av Python
by bernt & torsten
En RESTful API er en arkitektonisk utforming for et API (Application Program Interface) som bruker HTTP-forespørsler til å få tilgang til og bruke data. OAuth er en godkjenningsprotokoll som lar deg godkjenne ett program som samhandler med et annet på dine vegne uten å gi bort passordet ditt.
OAuth er et delegert autorisasjonsrammeverk som gjør det mulig for apper å få begrenset tilgang (omfang) til en brukers data uten å gi bort en brukers passord. Den decouples godkjenning fra autorisasjon og støtter flere brukstilfeller som adresserer forskjellige enhetsfunksjoner.
Den grunnleggende autentiseringen for restful API-er ser omtrent ut som kodeeksemplet nedenfor, koden er opprettet med Python og bruker Google Secrets Manager til å skjule hemmelighetene.
Enkel godkjenning
# 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
}
Kodesnutten leser hemmelighetene, og fra hemmelighetene oppretter og koder du godkjenningen som brukes i overskriften. Konfigurere URL-adressen og kalle funksjonen _requestandstore med URL-adresse og hode.
url = 'https://api.test.com/v1/users'
_requestandstore(url, headers)
Funksjonen som gjør forespørselen, URL-forespørselen er grei ved å inkludere detaljene i overskriftene for request.get
def _requestandstore(url, header):
try:
# Make a request
response = requests.get(url, params={'page': 1, 'per_page': 10}, headers=header)
Følgende kodesnuttfunksjoner er for å få hemmelighetene fra 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
Godkjenning av Oauth
OAuth (Open Authorization) er en åpen standard for tilgang til et program for brukere av den applikasjonen for å gi nettsteder eller applikasjoner tilgang til informasjonen sin på andre nettsteder, men uten å gi dem passordene. Når en bruker bruker Oauth på et nettsted, dukker det opp en samtykkeskjerm for å la brukerne gi sin tillatelse.
En skyfunksjon som kjører på en serverløs server, har ikke et brukergrensesnitt som lar brukerne gi det samtykket, i neste del her vil jeg forklare hvordan vi bruker OAuth i en cloud-funksjon.
Før jeg går videre, liker jeg å nevne at følgende kode fungerer bra i tilpasset RestFul API Oauth, hvis du skal bruke en Google API – kan det være lurt å lese Datapipeline youtube-analyse til BigQuery med Airbyte der jeg skrev om hvordan du kan få det til med Google OAuth.
Falsk Oauth-pålogging
For at vi skal kunne bruke OAuth i en cloud-funksjon, må vi gjøre en falsk OAuth-pålogging, slik at vi kan få tilgangstokenet, dette gjøres ved å gjøre en ugyldig forespørsel. Hvis redirect_uri er ugyldig, stopper leseren omadresseringen og viser autorisasjonskoden.
Her er koden – først må vi få vår klient-ID, klienthemmelighet og token_url, denne informasjonen er gitt av tjenesteleverandøren du prøver å koble til.
Det neste trinnet er å angi grant_type og lage en RestFUL API-innleggsforespørsel for å få tilgangstokenet.
# 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']
}
Når du har tilgangstokenet, angir du RESTFUL API URL med endepunkt og foretar et RestFul API-kall.
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)
Det er det, dette bør fungere i de fleste scenarier – og råd er å snakke med tjenesteleverandøren du prøver å få kontakt med for å utarbeide detaljene.
Brukstilfeller
For å nevne det er flere brukstilfeller der du vil bruke en skyfunksjon for å få tilgang til et tjenesteleverandørprogram. Jeg vil nevne noen, du kan ha mer, så vennligst kommenter nedenfor.
- Tjenesteleverandørutvinning av data til Data Warehosue som skal brukes til Analytics
- Uttrekking av data til data Warehosue som skal brukes til analytics
- Online media utvinning av data til Data Warehosue som skal brukes til 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...