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.
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)
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.
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.
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.
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