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
Why It’s Important to Exercise When You’re Over 60
Many of us find ourselves in a pickle as the years pile up. Once reliable sidekicks, our...
A Poem: The Last Time
You never know when it will be,
The last time you ski down slopes of snow,
A Poem: Time Millionaire
When the morning wakes, still and clear,
No more alarms, no more rush....