Bonjour à tous.
Cette fois, en utilisant la bibliothèque python Flask, cela correspond à la connexion LINE v2.1, Je souhaite créer une application de test.
https://developers.line.biz/ja/docs/line-login/integrate-line-login/
Installez les bibliothèques requises. Cette fois, nous utiliserons les bibliothèques suivantes.
Flask
requests
Flask-Session==0.3.0
uwsgi
gunicorn
argparse
https://github.com/myucy/line-login-v2.1-tester/blob/master/requirements.txt
Utilisez la bibliothèque Python https://pythonhosted.org/Flask-Session/. Puisqu'il s'agit d'une application de test, j'ai créé 32 caractères aléatoires avec une logique simple et C'est la session.
import random
import string
#Créer une clé unique pour une session
def randomstate(n):
randlst = [random.choice(string.ascii_letters + string.digits)
for i in range(n)]
return ''.join(randlst)
#Page d'accueil. Gestion des états avec bibliothèque de sessions
@app.route('/', methods=['GET'])
def Mainpage():
# randomstate(n)Contrôlez la longueur de l'état avec
session["state"] = randomstate(32)
return render_template('login.html',
state=session["state"]
)
Créez une demande d'autorisation de connexion LINE basée sur le contenu POSTÉ. https://developers.line.biz/ja/docs/line-login/integrate-line-login/#making-an-authorization-request Même s'il existe plusieurs étendues, la valeur de l'étendue est mise en boucle et récupérée afin de pouvoir être gérée.
from argparse import ArgumentParser
import json
import urllib.request
import requests
from flask import Flask, request, abort, render_template, jsonify, redirect, session
#Générer une demande d'autorisation pour la connexion LINE
@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)
Il vérifie simplement l'état et le gère lorsqu'une erreur se produit (lorsque la demande d'autorisation est annulée).
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')
#Si vous voulez l'essayer localement, uri= request.base_url
#Lorsque vous essayez avec un serveur externe, spécifiez l'adresse commençant par HTTTPS dans l'URI
uri = "Entrez l'URL de rappel"
error_description = request.args.get('error_description')
#Vérifier l'état avant la gestion des erreurs
expected_state = session.get('state')
if state != expected_state:
return "[Error] state does not match", 400
#Contrôle des erreurs telles que lorsqu'une demande d'autorisation est annulée
if error:
return "[Error] Not Logined: " + error + "\n" + error_description, 400
return render_template('callback.html',
code=code,
state=state,
uri=uri
)
L'application de test implémente également le décodage des jetons d'accès et des jetons d'identification. https://myucy-login.herokuapp.com/
En utilisant la bibliothèque Flask-Session, les contre-mesures CSRF peuvent être prises très facilement. Veuillez le mettre en œuvre. En parlant de cela, même si vous vous connectez au compte officiel avec le badge d'authentification, l'état est fixe. Vous pouvez le voir ici et là, mais est-ce que ça va?
Code source https://github.com/myucy/line-login-v2.1-tester
Recommended Posts