OAuth 2 simple avec Python (urllib + oauthlib)

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.

Pourquoi urllib + oauthlib

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

Préparation préalable

ʻOauthlib` n'est pas un module standard, alors installez-le.

$ pip install oauthlib

Puisque ʻurllibetjson` 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.

Obtenir un jeton d'accès

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.

Utilisez le jeton d'accès pour accéder à l'API

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.

Mettre à jour le jeton d'accès

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

OAuth 2 simple avec Python (urllib + oauthlib)
GRPC simple en Python
Analyse de régression simple avec Python
Client IRC simple avec python
Première analyse de régression simple en Python
Implémentation d'un algorithme simple en Python 2
Exécutez un algorithme simple en Python
Logique gacha simple écrite en Python
Un client HTTP simple implémenté en Python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
Ecrire une méthode de cupidité simple en Python
Ecrire un plugin Vim simple en Python 3
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
Mon urllib (Python)
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Étudier les mathématiques avec Python: résoudre des problèmes simples de probabilité
Notes de programme simples Pub / Sub en Python
Notes pour la mise en œuvre d'un co-filtrage simple en Python
Créer un modèle d'investissement dynamique simple en Python