Lors de l'utilisation de l'API OAuth 2 de Python, je n'ai pas trouvé de moyen concret d'utiliser ʻurllib + ʻoauthlib
, alors je l'ai essayé moi-même.
Cette fois, j'ai décrit API Netatmo comme exemple, mais si c'est une API qui prend en charge OAuth 2, la méthode devrait être presque la même.
ʻUrllib est bien organisé en tant que bibliothèque pour envoyer des requêtes HTTP, ʻoauthlib
est bien organisé en tant que bibliothèque pour gérer OAuth, et le moyen le plus simple de gérer les clients OAuth 2 en Python est de combiner les deux. Parce que j'ai pensé.
Cependant, Simple ≠ Easy, donc si vous voulez Easy, vous devez utiliser Requests-OAuthlib.
Référence: [urllib \ .request est suffisant pour le client HTTP Python \ -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)
ʻOauthlib` n'est pas un module standard, alors installez-le.
$ pip install oauthlib
Puisque ʻurllibet
json` sont utilisés partout, importez-les.
import urllib
import json
Obtenez les informations requises pour l'authentification.
NETATMO_API_CLIENT_ID = 'xxxxxxxxxxxxxxxx'
NETATMO_API_CLIENT_SECRET = 'xxxxxxxxxxxxxxxx'
NETATMO_API_SCOPE = ['read_station']
NETATMO_API_REDIRECT_URL = 'http://localhost/callback'
Cette fois, je veux juste utiliser l'API GET / getmeasure
, donc la portée ne doit être que read_station
.
Commencez par créer un objet WebApplicationClient
.
from oauthlib.oauth2 import WebApplicationClient
oauth = WebApplicationClient(NETATMO_API_CLIENT_ID)
Ensuite, générez une URL pour obtenir le code d'autorisation.
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)
L'URL pour demander l'autorisation à l'utilisateur s'affiche.
S'il s'agit d'une application Web, elle redirigera l'utilisateur vers cette URL, et si l'utilisateur l'accepte, elle passera à l'URL de redirection spécifiée par le code d'autorisation.
Ici, on suppose que l'URL de redirection a été accédée avec les paramètres suivants.
authorization_response = 'https://localhost/callback?state=xxxxxxxx&code=xxxxxxxx'
Maintenant que nous avons le code d'autorisation, nous pouvons l'utiliser pour obtenir le jeton d'accès.
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 prépare les paramètres de requête pour obtenir le jeton d'accès. À ce stade, il n'est pas nécessaire d'analyser le code d'autorisation par vous-même à partir de ʻauthorization_response
, passez-le simplement comme argument.
Pour l'API Netatmo, vous devez spécifier le secret client ici, mais je pense que c'est la même chose pour la plupart des API.
Si vous passez le résultat de la demande d'acquisition de jeton d'accès à ʻoauth.parse_request_body_response tel quel, il sera mis à ʻoauth.access_token
etc. sans permission.
L'authentification est maintenant terminée.
Essayez d'accéder à GET / getmeasure
.
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)
L'en-tête ʻAuthorization a été ajouté aux
en-têtes obtenus par ʻoauth.add_token
.
L'API Netatmo a une courte date d'expiration de 3 heures, donc si elle dépasse cela, il est nécessaire de renouveler le jeton d'accès à l'aide du jeton d'actualisation.
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 prépare les paramètres de requête pour la mise à jour du jeton d'accès. (Le jeton d'actualisation, etc. contenu dans ʻoauth
est automatiquement défini comme paramètre de requête)
Pour l'API Netatmo, vous devez spécifier ici également l'ID client et le secret client.
Recommended Posts