[PYTHON] [Connexion LINE] Vérifier l'état avec Flask

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/

1. Préparation

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

2. Délivrance de l'État

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"]
                           )

3. Créez une demande d'autorisation de connexion LINE

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)


4. Vérification par l'État

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
                           )

5. Testez l'application implémentée en fonction du contenu ci-dessus

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/

6. Remarque

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?

7. Bonus

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

Recommended Posts

[Connexion LINE] Vérifier l'état avec Flask
Passer la ligne en cas de connexion SSH réussie avec ifttt
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
Restriction IP avec Flask
Bonjour le monde sur flacon
Programmation avec Python Flask
Client de publication Twitter créé avec Flask avec une fonction de connexion simple
J'ai essayé de créer LINE-bot avec Python + Flask + ngrok + LINE Messaging API
Déployez Flask avec ZEIT maintenant
Implémenter la fonction de connexion avec django-allauth
Touch Flask + courir avec Heroku
Bonjour le monde avec Flask + Hamlish
Test unitaire du flacon avec pytest
API avec Flask + uWSGI + Nginx
Développement d'applications Web avec Flask
Voir la couverture du flacon avec pytest-cov
Connexion proxy facile avec django-hijack
Application Web avec Python + Flask ② ③
Téléchargement de fichiers avec Flask + jQuery
Connectez-vous avec Django Rest Framework
Application Web avec Python + Flask ④