[PYTHON] Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.

Einführung

Ich habe untersucht, wie die Graph-API beim Erstellen einer App verwendet wird, die Facebook-Freundinformationen in Python verwendet, daher werde ich sie zusammenfassen. Es ist für Anwendungen vorgesehen, die Flask verwenden.

Holen Sie sich einen Autorisierungscode

Wenn Sie zu "https: //graph.facebook.com/oauth/authorize? Client_id = **** & redirect_uri = **** & scope = ****" umleiten und die App nicht zulässig ist, erlauben Sie die App Seite wird angezeigt. In Flask können Sie diese URL angeben und "return redirect (https: // ****)" ausführen.

Parameter die Einstellungen
client_id Anwendungs-ID in Facebook-Entwicklern festgelegt
redirect_uri URL, die nach der Authentifizierung umgeleitet werden soll(URI-Codierung erforderlich)
scope Erlaubnis zum Anfordern

Wenn dies zulässig ist, wird zu dem in redirect_uri festgelegten Umleitungsziel übergegangen. Der zu diesem Zeitpunkt als Parameter zurückgegebene "Code" (Authentifizierungscode) wird für die nächste Erfassung des Zugriffstokens verwendet. Wenn ein Fehler auftritt, wird die JSON-Zeichenfolge mit dem Satz "error" wie unten gezeigt zurückgegeben.

error_sample


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

Holen Sie sich ein Zugriffstoken

Verwenden Sie den oben erhaltenen Bestätigungscode, um zu "https: //graph.facebook.com/oauth/access_token? Client_id = **** & client_secret = **** & redirect_uri = **** & code = ****" zu gelangen Greifen Sie zu und erhalten Sie ein Zugriffstoken.

Parameter die Einstellungen
client_id Anwendungs-ID in Facebook-Entwicklern festgelegt
client_secret App-Geheimschlüssel in Facebook-Entwicklern festgelegt
redirect_uri URL, die nach der Authentifizierung umgeleitet werden soll
code Authentifizierungscode oben erhalten(URI-Codierung erforderlich)

Die erfassten Daten haben die Form "access_token = **** & expires = ****", sodass der Wert unmittelbar nach "access_token =" abgerufen wird. In Python ist es eine gute Idee, etwas wie "urllib2.urlopen" zu verwenden, um das Ergebnis zu erhalten. Die Extraktionsmethode ist angemessen.

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

...

Sie haben jetzt ein Zugriffstoken erhalten.

Machen Sie es zu einem Kolbenfilter

Flaschenfilter, um automatisch ein Zugriffstoken zu erhalten, wenn Sie eine bestimmte Seite besuchen. (Im folgenden Beispiel wird die Verarbeitung bei Rückgabe eines Fehlers weggelassen.) Ist ein solcher Filter in Python übrigens ein Dekorateur? Ist das so? Ich bin mir in diesem Bereich immer noch nicht sicher.

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"

#Generieren Sie eine URL, um einen Autorisierungscode zu erhalten--------------------------------------------------
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}" )

#Holen Sie sich ein Zugriffstoken--------------------------------------------------
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

#Filterkörper--------------------------------------------------
def oauth_filter(f):

    @wraps(f)
    def wrapper(*args, **kwargs):
        #Wenn die Sitzung über ein Zugriffstoken verfügt, kehren Sie unverändert zurück
        if session.has_key('access_token'):
            return f(*args, **kwargs)

        #Wenn die Sitzung kein Zugriffstoken hat, rufen Sie es durch automatische Authentifizierung ab
        code = request.args.get('code')

        #Fälle nach dem Status der Anforderungsparameter
        if code is None:
            #Rufen Sie den Code ab, wenn kein Autorisierungscode festgelegt wurde
            return redirect( create_url_for_auth_code( request.path ) )

        else:
            #Holen Sie sich ein Zugriffstoken, wenn ein Autorisierungscode festgelegt ist
            session['access_token'] = get_access_token( request.path, code )
            return redirect( domain + request.path )

        #Wenn die Bedingungen nicht erfüllt sind, beenden Sie das Programm unverändert
        return f(*args, **kwargs)

    return wrapper

...

Auf jedes Routing anwenden

Wenden Sie den obigen Filter an. Alles, was Sie tun müssen, ist, der Methode, die jedes Routing angibt, "@ oauth_filter" hinzuzufügen.

main.py


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

...

#Gilt nicht für die Startseite
@app.route('/')
def index():
    return render_template("top.html")

#Gilt für Meine Seite
@app.route('/mypage')
@oauth_filter #Anwenden! !!
def mypage():
    return render_template("mypage.html")

#Entfernen Sie das Zugriffstoken aus der Sitzung, wenn Sie sich abmelden
@app.route('/logout')
def logout():
    if session.has_key( 'access_token' ):
        del session['access_token']
    return redirect( '/' )

...

abschließend

Mit dem oben genannten sollte es vorerst funktionieren. Diese Informationen wurden basierend auf dem PHP-Beispiel unter Verwendung der folgenden Graph-API und der Erläuterung des Python-Anmeldedekorators erstellt.

Referenz

Recommended Posts

Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.
Holen Sie sich ein Zugriffstoken für die Pocket-API
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
So erstellen Sie eine Rest-API in Django
Erstellen Sie einen Befehl, um das Arbeitsprotokoll abzurufen
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Eine Einführung in die moderne Socket-API zum Erlernen in C.
Erstellen Sie mit Flask einen CSV-Reader
Greifen Sie mit Python auf die Twitter-API zu
Eine einfache Möglichkeit, die Amazon-Produkt-API in Python aufzurufen
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
Gewähren Sie mit dem Befehl curl ein Zugriffstoken und POSTEN Sie die API
Klicken Sie in Python auf die New Relic-API, um den Status des Servers abzurufen
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Rufen Sie die Formel in der Excel-Datei als Zeichenfolge in Python ab
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
So entfernen Sie die "Tags müssen ein Array von Hashes sein." Fehler in Qiita API
Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
Ruft die längste Zeichenlänge ab, die in einem Intervall in einem Segmentbaum enthalten ist
Erstellen Sie mit dem Sympy-Modul ein Diagramm
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Wie bekomme ich Stacktrace in Python?
Codebeispiel zum Abrufen von oauth_token und oauth_token_secret der Twitter-API in Python 2.7
Erstellen Sie eine Anwendung mit der Spotify-API
Holen Sie sich ein Zeichen für Conoha mit Python
[Python] Erstellen Sie schnell eine API mit Flask
Erstellen Sie eine einfache App, die die Fetch-API für Ajax-Anforderungen in Flask enthält, und erklären Sie sie schnell.
Ich habe versucht zu erklären, wie der Artikelinhalt mit der MediaWiki-API auf leicht verständliche Weise anhand von Beispielen abgerufen werden kann (Python 3).
Im Chainer-Tutorial wird beim Importieren eines Pakets eine Fehlermeldung angezeigt. (spotten)
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
Ermitteln Sie mithilfe der Twitter-API die Anzahl der Tweets, die sich auf ein bestimmtes Keyword beziehen
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Erstellen Sie eine Datei, die in der Skriptsprache ausgeführt werden kann
Lassen Sie uns Wiki-Informationen mithilfe der MediaWiki-API abrufen
Holen Sie sich den Aufrufer einer Funktion in Python
Ich möchte mit Python ein Fenster erstellen
Erstellen Sie in Python ein Diagramm der Standardnormalverteilung
So erstellen Sie eine JSON-Datei in Python
So erhalten Sie Hilfe in einer interaktiven Shell
So erhalten Sie die Dateien im Ordner [Python]
Loggen Sie sich mit json mit pygogo ein.
Konvertieren Sie eine Pfadzeichenfolge, die einen symbolischen Link in der Mitte verwendet, in einen absoluten Pfad
Eine Geschichte über einen Python-Anfänger, der versucht, Google-Suchergebnisse mithilfe der API abzurufen
[Für Anfänger] Web-Scraping mit Python "Greifen Sie auf die URL auf der Seite zu, um den Inhalt abzurufen."
Eine Geschichte über den Versuch, Linter mitten in einem Python (Flask) -Projekt vorzustellen
Verwenden Sie die Twitter-API, um die von Twitter benötigte Zeit zu verkürzen (erstellen Sie eine Hervorhebungszeitleiste).
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
So erstellen Sie einen Artikel über die Befehlszeile
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
So erhalten Sie den Variablennamen selbst in Python
Erstellen Sie eine Funktion zur Visualisierung / Auswertung des Clustering-Ergebnisses
Der einfachste Weg, um Last-Modified in Flask einzurichten
Abrufen des Dateinamens in einem Ordner mithilfe von glob
So ermitteln Sie die Anzahl der Stellen in Python
Ich möchte mit einem Knopf am Kolben übergehen