[PYTHON] Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)

introduction

J'ai étudié comment utiliser l'API Graph lors de la création d'une application qui utilise les informations d'amis Facebook en Python, je vais donc le résumer. Il est destiné aux applications utilisant Flask.

Obtenez un code d'autorisation

Si vous redirigez vers https: //graph.facebook.com/oauth/authorize? Client_id = **** & redirect_uri = **** & scope = **** et que l'application n'est pas autorisée, l'application autorise La page s'affiche. Dans Flask, vous pouvez spécifier cette URL et faire return redirect (https: // ****).

Paramètres Réglages
client_id ID d'application défini dans les développeurs Facebook
redirect_uri URL à rediriger après authentification(Encodage URI requis)
scope Autorisation de demander

Si autorisé, il passera à la destination de redirection définie dans redirect_uri. Le code (code d'authentification) renvoyé en tant que paramètre à ce moment sera utilisé pour la prochaine acquisition de jeton d'accès. De plus, si une erreur se produit, la chaîne de caractères JSON avec le jeu ʻerror` est renvoyée comme indiqué ci-dessous.

error_sample


{
    "error": {
        "message": "redirect_uri isn't an absolute URI. Check RFC 3986.",
        "type": "OAuthException",
        "code": 191,
        "fbtrace_id": "XXXXXXXXXXX"
    }
}

Obtenez un jeton d'accès

Utilisez le code de vérification obtenu ci-dessus pour accéder à https: //graph.facebook.com/oauth/access_token? Client_id = **** & client_secret = **** & redirect_uri = **** & code = **** Accédez et obtenez un jeton d'accès.

Paramètres Réglages
client_id ID d'application défini dans les développeurs Facebook
client_secret Clé secrète d'application définie dans les développeurs Facebook
redirect_uri URL à rediriger après authentification
code Code d'authentification obtenu ci-dessus(Encodage URI requis)

Les données acquises sont sous la forme de ʻaccess_token = **** & expires = **** , donc la valeur immédiatement après ʻaccess_token = est retirée. En Python, c'est une bonne idée d'utiliser quelque chose comme ʻurllib2.urlopen` pour obtenir le résultat. La méthode d'extraction est appropriée.

main.py


from werkzeug.urls import url_quote_plus
import urllib2

...

app_id = "xxxxxxxx"
app_secret = "xxxxxxxx"
url_redirect = url_quote_plus( "https://hogehoge.com" )
code = "xxxxxxxx"

url_token = ( "https://graph.facebook.com/oauth/access_token"
              "?client_id={0}&client_secret={1}"
              "&redirect_uri={2}&code={3}" )

try:
    resp = urllib2.urlopen( url_token.format( app_id, app_secret, url_redirect, code ) )
    data = resp.read().split('&')
    access_token = data[0].strip('access_token=')

finally:
    resp.close()

...

Vous avez maintenant obtenu un jeton d'accès.

Faites-en un filtre Flask

Filtres Flask pour obtenir automatiquement un jeton d'accès lorsque vous visitez une page particulière. (Dans l'exemple ci-dessous, le traitement lorsqu'une erreur est renvoyée est omis.) Au fait, en Python, un tel filtre est-il un décorateur? Est-ce vrai? Je ne suis toujours pas sûr de ce domaine.

main.py


from werkzeug.urls import url_quote_plus
from functools import wraps
from flask import Flask, request, redirect, session
import urllib2

...

domain = "https://hogehoge.com"
app_id = "xxxxxxxx"
app_secret = "xxxxxxxx"

#Générer une URL pour obtenir un code d'autorisation--------------------------------------------------
def create_url_for_auth_code( path_orig ):
    url_orig = url_quote_plus( domain + path_orig )
    return ( "https://graph.facebook.com/oauth/authorize"
             "?client_id={0}&redirect_uri={1}&scope={2}" )

#Obtenez un jeton d'accès--------------------------------------------------
def get_access_token( path_orig, code ):
    url_orig = url_quote_plus( domain + path_orig )
    url_token = ( "https://graph.facebook.com/oauth/access_token"
                  "?client_id={0}&client_secret={1}"
                  "&redirect_uri={2}&code={3}" )

    try:
        resp = urllib2.urlopen(url_token.format(app_id, app_secret, url_orig, code))
        data = resp.read().split('&')
        access_token = data[0].strip('access_token=')
    finally:
        resp.close()

    return access_token

#Corps de filtre--------------------------------------------------
def oauth_filter(f):

    @wraps(f)
    def wrapper(*args, **kwargs):
        #Si la session a un jeton d'accès, retournez-le tel quel
        if session.has_key('access_token'):
            return f(*args, **kwargs)

        #Si la session n'a pas de jeton d'accès, obtenez-le par authentification oauth
        code = request.args.get('code')

        #Cas selon l'état des paramètres de la demande
        if code is None:
            #Obtenez le code si aucun code d'autorisation n'a été défini
            return redirect( create_url_for_auth_code( request.path ) )

        else:
            #Obtenez un jeton d'accès si un code d'autorisation est défini
            session['access_token'] = get_access_token( request.path, code )
            return redirect( domain + request.path )

        #Si les conditions ne sont pas remplies, quittez tel quel
        return f(*args, **kwargs)

    return wrapper

...

Appliquer à chaque routage

Appliquez le filtre ci-dessus. Tout ce que vous avez à faire est d'ajouter @ oauth_filter à la méthode qui spécifie chaque routage.

main.py


from flask import Flask, render_template, redirect, session
app = Flask(__name__)

...

#Ne s'applique pas à la première page
@app.route('/')
def index():
    return render_template("top.html")

#S'applique à ma page
@app.route('/mypage')
@oauth_filter #Application! !!
def mypage():
    return render_template("mypage.html")

#Supprimer le jeton d'accès de la session lors de la déconnexion
@app.route('/logout')
def logout():
    if session.has_key( 'access_token' ):
        del session['access_token']
    return redirect( '/' )

...

en conclusion

Avec ce qui précède, cela devrait fonctionner pour le moment. Ces informations ont été créées sur la base de l'exemple PHP à l'aide de l'API Graph ci-dessous et de l'explication du décorateur de connexion Python.

référence

Recommended Posts

Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)
Obtenez un jeton d'accès pour l'API Pocket
Créez une fonction pour obtenir le contenu de la base de données dans Go
Comment créer une API Rest dans Django
Créez une commande pour obtenir le journal de travail
Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Une introduction à l'API de socket moderne pour apprendre en C
Créer un lecteur CSV avec Flask
Accéder à l'API Twitter avec Python
Un moyen simple d'accéder à l'API produit Amazon en Python
Créez un alias pour Route53 vers CloudFront avec l'API AWS
Comment obtenir toutes les valeurs possibles dans une expression régulière
Accordez un jeton d'accès avec la commande curl et POST l'API
Accédez à l'API New Relic en Python pour obtenir l'état du serveur
Comment obtenir les coordonnées de sommet d'une entité dans ArcPy
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Comment éliminer le "Les balises doivent être un tableau de hachages." Erreur dans l'API qiita
Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)
Obtenir la longueur de caractère la plus longue contenue dans un intervalle dans une arborescence de segments
Créer un graphique à l'aide du module Sympy
[Linux] Une commande pour obtenir une liste des commandes exécutées dans le passé
Comment obtenir stacktrace en python
Exemple de code pour obtenir oauth_token et oauth_token_secret de l'API Twitter en Python 2.7
Créer une application à l'aide de l'API Spotify
Obtenez un jeton pour conoha avec python
[Python] Créez rapidement une API avec Flask
Créez une application simple qui intègre l'API Fetch pour les requêtes Ajax dans Flask et expliquez-la rapidement.
J'ai essayé d'expliquer comment obtenir le contenu de l'article avec l'API MediaWiki d'une manière facile à comprendre avec des exemples (Python 3)
Dans le tutoriel Chainer, j'obtiens une erreur lors de l'importation d'un package. (moquer)
Créez une API REST à l'aide du modèle appris dans Lobe et TensorFlow Serving.
Utilisez libsixel pour générer Sixel en Python et générer le graphe Matplotlib vers le terminal.
Obtenez le nombre de tweets liés à un certain mot-clé à l'aide de l'API Twitter
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Python] Récupérez les fichiers dans le dossier avec Python
Créer un fichier qui peut être exécuté dans le langage de script
Obtenons les informations Wiki en utilisant l'API MediaWiki
Récupérer l'appelant d'une fonction en Python
Je veux créer une fenêtre avec Python
Créer un graphique de distribution normale standard en Python
Comment créer un fichier JSON en Python
Comment obtenir de l'aide dans un shell interactif
Comment obtenir les fichiers dans le dossier [Python]
Connectez-vous avec json en utilisant pygogo.
Convertir une chaîne de chemin qui utilise un lien symbolique au milieu en un chemin absolu
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
[Pour les débutants] Web scraping avec Python "Accédez à l'URL de la page pour obtenir le contenu"
Une histoire sur la tentative d'introduire Linter au milieu d'un projet Python (Flask)
Utilisez l'API Twitter pour réduire le temps nécessaire à Twitter (créer une chronologie de mise en évidence (comme))
Lire la source Python-Markdown: Comment créer un analyseur
Comment créer un article à partir de la ligne de commande
J'ai essayé de représenter graphiquement les packages installés en Python
Comment obtenir le nom de la variable lui-même en python
Créer une fonction pour visualiser / évaluer le résultat du clustering
Le moyen le plus simple de configurer Last-Modified dans Flask
Obtenir le nom de fichier dans un dossier à l'aide de glob
Comment obtenir le nombre de chiffres en Python
Je veux faire la transition avec un bouton sur le ballon