Einfaches OAuth 2 mit Python (urllib + oauthlib)

Bei Verwendung der OAuth 2-API von Python kam die spezifische Methode zur Verwendung von "urllib" + "oauthlib" nicht heraus, selbst wenn ich sie gegoogelt habe, also habe ich es selbst versucht.

Dieses Mal habe ich Netatmo API als Beispiel beschrieben, aber wenn es sich um eine API handelt, die OAuth 2 unterstützt, sollte die Methode fast dieselbe sein.

Warum urllib + oauthlib

urllib ist als Bibliothek zum Senden von HTTP-Anforderungen gut organisiert, oauthlib ist als Bibliothek zum Behandeln von OAuth gut organisiert, und der einfachste Weg zum Behandeln von OAuth 2-Clients in Python besteht darin, beide zu kombinieren. Weil ich dachte.

Da jedoch Simple ≠ Easy ist, sollten diejenigen, die Easy möchten, Requests-OAuthlib verwenden.

Referenz: [urllib \ .request ist ausreichend für Python-HTTP-Client \ -Qiita](https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217#post-%E3%83%AA%E3%82%AF%E3% 82% A8% E3% 82% B9% E3% 83% 88% E3% 82% 92% E6% 8A% 95% E3% 81% 92% E3% 82% 8B)

Vorbereitungen

Da oauthlib kein Standardmodul ist, installieren Sie es.

$ pip install oauthlib

Da urllib und json durchgehend verwendet werden, importieren Sie sie.

import urllib
import json

Erhalten Sie die für die Authentifizierung erforderlichen Informationen.

NETATMO_API_CLIENT_ID = 'xxxxxxxxxxxxxxxx'
NETATMO_API_CLIENT_SECRET = 'xxxxxxxxxxxxxxxx'
NETATMO_API_SCOPE = ['read_station']
NETATMO_API_REDIRECT_URL = 'http://localhost/callback'

Dieses Mal möchte ich nur die GET / getmeasure API verwenden, daher muss der Bereich nur read_station sein.

Zugriffstoken erhalten

Erstellen Sie zunächst ein WebApplicationClient-Objekt.

from oauthlib.oauth2 import WebApplicationClient

oauth = WebApplicationClient(NETATMO_API_CLIENT_ID)

Generieren Sie als Nächstes eine URL, um den Autorisierungscode abzurufen.

url, headers, body = oauth.prepare_authorization_request('https://api.netatmo.com/oauth2/authorize', redirect_url=NETATMO_API_REDIRECT_URL, scope=NETATMO_API_SCOPE)
print(url)  

Die URL, um den Benutzer um Erlaubnis zu bitten, wird angezeigt.

Wenn es sich um eine Webanwendung handelt, wird der Benutzer zu dieser URL umgeleitet. Wenn der Benutzer dies akzeptiert, wird zur im Autorisierungscode angegebenen Umleitungs-URL gesprungen.

Hier wird davon ausgegangen, dass auf die Redirect-URL mit den folgenden Parametern zugegriffen wurde.

authorization_response = 'https://localhost/callback?state=xxxxxxxx&code=xxxxxxxx'

Nachdem wir den Autorisierungscode haben, können wir ihn verwenden, um das Zugriffstoken zu erhalten.

url, headers, body = oauth.prepare_token_request('https://api.netatmo.com/oauth2/token', authorization_response=authorization_response, client_secret=NETATMO_API_CLIENT_SECRET)
req = urllib.request.Request(url, body.encode(), headers=headers)
with urllib.request.urlopen(req) as res:
    oauth.parse_request_body_response(res.read())

oauth.prepare_token_request bereitet die Anforderungsparameter für das Abrufen des Zugriffstokens vor. Zu diesem Zeitpunkt ist es nicht erforderlich, den Autorisierungscode von "authorisation_response" selbst zu analysieren, sondern nur als Argument zu übergeben.

Für die Netatmo-API müssen Sie hier das Client-Geheimnis angeben, aber ich denke, dass es für die meisten APIs dasselbe ist.

Wenn Sie das Ergebnis der Access Token-Erfassungsanforderung unverändert an "oauth.parse_request_body_response" übergeben, wird es ohne Erlaubnis auf "oauth.access_token" usw. gesetzt.

Die Authentifizierung ist jetzt abgeschlossen.

Verwenden Sie das Zugriffstoken, um auf die API zuzugreifen

Versuchen Sie, auf GET / getmeasure zuzugreifen. https://dev.netatmo.com/apidocumentation/weather#getmeasure

columns = ['temperature', 'co2', 'humidity', 'pressure', 'noise']
params = {
    'date_begin': 1577836800,  # 2020-01-01 00:00:00 UTC
    'device_id': 'xx:xx:xx:xx:xx:xx',
    'scale': '30min',
    'type': ','.join(columns),
    'optimize': 'false',
}
url = 'https://api.netatmo.com/api/getmeasure?' + urllib.parse.urlencode(params)
url, headers, body = oauth.add_token(url)
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req) as res:
    data = json.load(res)

Der Header "Authorization" wurde zu den von "oauth.add_token" erhaltenen "Headern" hinzugefügt.

Zugriffstoken aktualisieren

Die Netatmo-API hat ein kurzes Ablaufdatum von 3 Stunden. Wenn es dieses überschreitet, muss das Zugriffstoken mithilfe des Aktualisierungstokens erneuert werden.

url, headers, body = oauth.prepare_refresh_token_request('https://api.netatmo.com/oauth2/token', client_id=NETATMO_API_CLIENT_ID, client_secret=NETATMO_API_CLIENT_SECRET)
req = urllib.request.Request(url, body.encode(), headers=headers)
with urllib.request.urlopen(req) as res:
    oauth.parse_request_body_response(res.read())

oauth.prepare_refresh_token_request bereitet Anforderungsparameter für die Aktualisierung des Zugriffstokens vor. (Aktualisierungstoken usw. in "oauth" werden automatisch als Anforderungsparameter festgelegt.)

Für die Netatmo-API müssen Sie hier zusätzlich die Client-ID und das Client-Geheimnis angeben.

Recommended Posts

Einfaches OAuth 2 mit Python (urllib + oauthlib)
Einfacher gRPC in Python
Einfache Regressionsanalyse mit Python
Einfacher IRC-Client mit Python
Erste einfache Regressionsanalyse in Python
Implementierung eines einfachen Algorithmus in Python 2
Führen Sie einen einfachen Algorithmus in Python aus
Einfache Gacha-Logik in Python geschrieben
Ein einfacher HTTP-Client, der in Python implementiert ist
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie eine einfache GUI-App in Python
Schreiben Sie eine einfache Giermethode in Python
Schreiben Sie ein einfaches Vim-Plugin in Python 3
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
Meine Urllib (Python)
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Mathematik studieren mit Python: Lösen einfacher Wahrscheinlichkeitsprobleme
Einfache Pub / Sub-Programmhinweise in Python
Hinweise zur Implementierung einer einfachen Co-Filterung in Python
Erstellen Sie in Python ein einfaches Momentum-Investmentmodell