[PYTHON] [LINE-Anmeldung] Überprüfen Sie den Status mit Flask

Hallo zusammen.

Dieses Mal entspricht es unter Verwendung der Python-Bibliothek Flask dem LINE-Login v2.1. Ich möchte eine Test-App machen.

https://developers.line.biz/ja/docs/line-login/integrate-line-login/

1. Vorbereitung

Installieren Sie die erforderlichen Bibliotheken. Dieses Mal werden wir die folgenden Bibliotheken verwenden.

Flask
requests
Flask-Session==0.3.0
uwsgi
gunicorn
argparse

https://github.com/myucy/line-login-v2.1-tester/blob/master/requirements.txt

2. Erteilung des Staates

Verwenden Sie die Python-Bibliothek https://pythonhosted.org/Flask-Session/. Da dies eine Test-App ist, habe ich 32 zufällige Zeichen mit einfacher Logik und erstellt Dies ist die Sitzung.


import random
import string

#Erstellen eines eindeutigen Schlüssels für eine Sitzung

def randomstate(n):
    randlst = [random.choice(string.ascii_letters + string.digits)
               for i in range(n)]
    return ''.join(randlst)

#Hauptseite. Statusverwaltung mit Sitzungsbibliothek
@app.route('/', methods=['GET'])
def Mainpage():
    # randomstate(n)Steuern Sie die Statuslänge mit
    session["state"] = randomstate(32)
    return render_template('login.html',
                           state=session["state"]
                           )

3. Erstellen Sie eine LINE-Anmeldeautorisierungsanforderung

Erstellen Sie eine LINE-Anmeldeautorisierungsanforderung basierend auf dem POST-Inhalt. https://developers.line.biz/ja/docs/line-login/integrate-line-login/#making-an-authorization-request Selbst wenn mehrere Bereiche vorhanden sind, wird der Bereichswert in einer Schleife ausgeführt und abgerufen, damit er verarbeitet werden kann.

from argparse import ArgumentParser
import json
import urllib.request
import requests

from flask import Flask, request, abort, render_template, jsonify, redirect, session
#Generieren einer Autorisierungsanforderung für die LINE-Anmeldung
@app.route('/login', methods=['POST'])
def authorizeReq():
    scopes = ""
    i = 0
    for key in request.form.getlist("ScopeValue"):
        if (i < 1):
            i = i + 1
            scopes = key
        else:
            scopes = scopes+" "+key
    queries = {}
    queries['response_type'] = 'code'
    queries['client_id'] = request.form['ChannelIdValue']
    queries['redirect_uri'] = request.form['redirect_uriValue']
    queries['scope'] = scopes
    queries['state'] = request.form['stateValue']
    queries['prompt'] = request.form['promptValue']
    queries['bot_prompt'] = request.form['bot_promptValue']
    queries['nonce'] = request.form['nonceValue']
    queries['max_age'] = request.form['max_ageValue']
    queries['ui_locales'] = request.form['ui_localesValue']
    authorize_url = 'https://access.line.me/oauth2/v2.1/authorize?' + \
        urllib.parse.urlencode(queries)
    return redirect(authorize_url)


4. Zustandsüberprüfung

Es überprüft einfach den Status und behandelt Fehler (wenn die Autorisierungsanforderung abgebrochen wird).

from argparse import ArgumentParser
import json
import urllib.request
import requests

from flask import Flask, request, abort, render_template, jsonify, redirect, session

@app.route('/callback', methods=['GET'])
def Callbackpage():
    state = request.args.get('state')
    error = request.args.get('error')
    code = request.args.get('code')
    #Wenn Sie es lokal ausprobieren möchten, uri= request.base_url
    #Wenn Sie es mit einem externen Server versuchen, geben Sie die Adresse an, die mit HTTTPS in uri beginnt
    uri = "Geben Sie die Rückruf-URL ein"

    error_description = request.args.get('error_description')

    #Überprüfen Sie den Status vor der Fehlerbehandlung
    expected_state = session.get('state')
    if state != expected_state:
        return "[Error] state does not match", 400


    #Kontrolle von Fehlern, z. B. wenn eine Autorisierungsanforderung storniert wird
    if error:
        return "[Error] Not Logined: " + error + "\n" + error_description, 400

    return render_template('callback.html',
                           code=code,
                           state=state,
                           uri=uri
                           )

5. Test-App basierend auf den oben genannten Inhalten implementiert

Die Test-App implementiert auch die Dekodierung von Zugriffstoken und ID-Token. https://myucy-login.herokuapp.com/

6. Hinweis

Durch die Verwendung der Flask-Session-Bibliothek können CSRF-Gegenmaßnahmen sehr einfach ergriffen werden. Bitte implementieren Sie es. Apropos, selbst wenn Sie sich mit dem Authentifizierungsausweis beim offiziellen Konto anmelden, ist der Status festgelegt. Sie können es hier und da sehen, aber ist das in Ordnung?

7. Bonus

Quellcode https://github.com/myucy/line-login-v2.1-tester

Recommended Posts

[LINE-Anmeldung] Überprüfen Sie den Status mit Flask
Überspringen Sie die Zeile bei erfolgreicher SSH-Anmeldung mit ifttt
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
IP-Einschränkung mit Flask
Hallo Welt auf Flasche
Programmieren mit Python Flask
Twitter-Posting-Client mit Flask mit einfacher Anmeldefunktion
Ich habe versucht, LINE-Bot mit Python + Flask + ngrok + LINE Messaging API zu erstellen
Stellen Sie Flask jetzt mit ZEIT bereit
Implementieren Sie die Anmeldefunktion mit django-allauth
Berühre Flask + laufe mit Heroku
Hallo Welt mit Flask + Hamlish
Testen Sie den Kolben mit einem Pytest
API mit Flask + uWSGI + Nginx
Entwicklung von Webanwendungen mit Flask
Anzeigen der Kolbenabdeckung mit pytest-cov
Einfache Proxy-Anmeldung mit Django-Hijack
Webanwendung mit Python + Flask ② ③
Datei-Upload mit Flask + jQuery
Melden Sie sich mit dem Django Rest Framework an
Webanwendung mit Python + Flask ④