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/
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
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"]
)
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)
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
)
Die Test-App implementiert auch die Dekodierung von Zugriffstoken und ID-Token. https://myucy-login.herokuapp.com/
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?
Quellcode https://github.com/myucy/line-login-v2.1-tester
Recommended Posts