Gestion de l'authentification pour le access token et refresh_token
@@ -12,6 +12,7 @@ twitchAPI>=4.5.0
|
||||
# Nécessaire pour l'hébergement du site web
|
||||
flask>=2.3.2
|
||||
flask-sqlalchemy>=3.0.3
|
||||
flask[async]
|
||||
waitress>=3.0.2
|
||||
|
||||
# Nécessaire pour l'appel à l'API Humble Bundle
|
||||
|
||||
@@ -2,4 +2,4 @@ from flask import Flask
|
||||
|
||||
webapp = Flask(__name__)
|
||||
|
||||
from webapp import commandes, configurations, index, humeurs, messages, moderation, protondb
|
||||
from webapp import commandes, configurations, index, humeurs, messages, moderation, protondb, twitch_auth
|
||||
|
||||
@@ -27,4 +27,4 @@ def updateConfiguration():
|
||||
|
||||
@webapp.route("/configurations/twitch/help")
|
||||
def twitchConfigurationHelp():
|
||||
return render_template("twitch-aide.html")
|
||||
return render_template("twitch-aide.html", token_redirect_url = f'{request.url_root[:-1]}{url_for('twitchReceiveToken')}')
|
||||
|
||||
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 151 KiB After Width: | Height: | Size: 153 KiB |
|
Before Width: | Height: | Size: 100 KiB |
|
Before Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 76 KiB |
@@ -18,10 +18,6 @@
|
||||
<input name="twitch_client_id" type="text" value="{{ configuration.getValue('twitch_client_id') }}" />
|
||||
<label for="twitch_client_secret">Client Secret</label>
|
||||
<input name="twitch_client_secret" type="text" value="{{ configuration.getValue('twitch_client_secret') }}" />
|
||||
<label for="twitch_access_token">Access Token</label>
|
||||
<input name="twitch_access_token" type="text" value="{{ configuration.getValue('twitch_access_token') }}" />
|
||||
<label for="twitch_refresh_token">Refresh Token</label>
|
||||
<input name="twitch_refresh_token" type="text" value="{{ configuration.getValue('twitch_refresh_token') }}" />
|
||||
<label for="twitch_channel">Chaîne à rejoindre</label>
|
||||
<input name="twitch_channel" type="text" value="{{ configuration.getValue('twitch_channel') }}"
|
||||
placeholder="#machinTruc" />
|
||||
@@ -29,6 +25,17 @@
|
||||
<p>
|
||||
<a href="{{ url_for('twitchConfigurationHelp') }}">Aide</a>
|
||||
</p>
|
||||
{% if configuration.getValue('twitch_client_secret') and configuration.getValue('twitch_client_id') %}
|
||||
<p>
|
||||
<a href="{{ url_for('twitchRequestToken') }}">Obtenir token et refresh token</a>
|
||||
</p>
|
||||
<label for="twitch_access_token">Access Token</label>
|
||||
<input name="twitch_access_token" type="text" value="{{ configuration.getValue('twitch_access_token') }}"
|
||||
readonly="readonly" />
|
||||
<label for="twitch_refresh_token">Refresh Token</label>
|
||||
<input name="twitch_refresh_token" type="text" value="{{ configuration.getValue('twitch_refresh_token') }}"
|
||||
readonly="readonly" />
|
||||
{% endif %}
|
||||
<p>Nécessite un redémarrage</p>
|
||||
</form>
|
||||
|
||||
|
||||
@@ -3,14 +3,15 @@
|
||||
{% block content %}
|
||||
<h1>Procédure de configuration de Twitch</h1>
|
||||
<p>
|
||||
<strong>Avant toute chose, activez l'authentification à deux facteurs (2FA) :</strong>
|
||||
<a href="https://help.twitch.tv/s/article/two-factor-authentication?language=en_US" target="_blank">Guide officiel Twitch pour la 2FA</a>
|
||||
<strong>Avant toute chose, activez l'authentification à deux facteurs (2FA) :</strong>
|
||||
<a href="https://help.twitch.tv/s/article/two-factor-authentication?language=en_US" target="_blank">Guide officiel
|
||||
Twitch pour la 2FA</a>
|
||||
</p>
|
||||
<p>
|
||||
Rendez-vous sur <a href="https://dev.twitch.tv/console" target="_blank">la console d'applications Twitch</a> et
|
||||
ajoutez une application. Renseignez :
|
||||
<ul>
|
||||
<li>URL de redirection : https://twitchtokengenerator.com</li>
|
||||
<li>URL de redirection : {{token_redirect_url}}</li>
|
||||
<li>Catégorie : Chat Bot</li>
|
||||
</ul>
|
||||
</p>
|
||||
@@ -25,25 +26,10 @@
|
||||
<img src="/static/img/twitch-api-02.jpg">
|
||||
|
||||
<p>
|
||||
Ensuite, rendez-vous sur <a href="https://twitchtokengenerator.com/" target="_blank">twitchtokengenerator.com</a> et
|
||||
sélectionnez <strong>Custom Scope Target</strong>. Dans la section <strong>Use My Client Secret and Client
|
||||
ID</strong>, renseignez les deux champs.
|
||||
Ensuite, retourner sur la page de <a href="{{url_for('openConfigurations')}}">Configuration</a>, apres avoir
|
||||
enregistret le <strong>Client ID</strong> et le <strong>Client Secret</strong>, cliquer sur le lien <strong>Obtenir
|
||||
token et refresh token</strong>. Si tout se passe bien les champs <strong>Access Token</strong> et
|
||||
<strong>Refresh Token</strong> sont rempli.
|
||||
</p>
|
||||
|
||||
<img src="/static/img/twitch-api-03.jpg">
|
||||
|
||||
<p>
|
||||
Ensuite, dans la section <strong>Available Token Scopes</strong>, cochez <em>chat:read</em> et <em>chat:edit</em>.
|
||||
Puis, dans la même section, cliquez sur <strong>Generate token</strong>.
|
||||
</p>
|
||||
|
||||
<img src="/static/img/twitch-api-04.jpg">
|
||||
|
||||
<p>
|
||||
Suivez la procédure et vous avez votre <strong>Access Token</strong> et <strong>Refresh Token</strong>
|
||||
</p>
|
||||
|
||||
<img src="/static/img/twitch-api-05.jpg">
|
||||
|
||||
|
||||
{% endblock %}
|
||||
45
webapp/twitch_auth.py
Normal file
@@ -0,0 +1,45 @@
|
||||
import logging
|
||||
|
||||
from flask import request, redirect, url_for
|
||||
from twitchAPI.twitch import Twitch
|
||||
from twitchAPI.type import TwitchAPIException
|
||||
from twitchAPI.oauth import UserAuthenticator
|
||||
|
||||
from database import db
|
||||
from database.helpers import ConfigurationHelper
|
||||
from twitchbot import USER_SCOPE
|
||||
from webapp import webapp
|
||||
|
||||
|
||||
auth: UserAuthenticator
|
||||
|
||||
@webapp.route("/configurations/twitch/request-token")
|
||||
async def twitchRequestToken():
|
||||
global auth
|
||||
url = f'{request.url_root[:-1]}{url_for('twitchReceiveToken')}'
|
||||
helper = ConfigurationHelper()
|
||||
twitch = await Twitch(helper.getValue('twitch_client_id'), helper.getValue('twitch_client_secret'))
|
||||
auth = UserAuthenticator(twitch, USER_SCOPE, url=url)
|
||||
return redirect(auth.return_auth_url())
|
||||
|
||||
@webapp.route("/configurations/twitch/receive-token")
|
||||
async def twitchReceiveToken():
|
||||
global auth
|
||||
state = request.args.get('state')
|
||||
code = request.args.get('code')
|
||||
if state != auth.state :
|
||||
logging('bad returned state')
|
||||
return redirect(url_for('openConfigurations'))
|
||||
if code == None :
|
||||
logging('no returned state')
|
||||
return redirect(url_for('openConfigurations'))
|
||||
|
||||
try:
|
||||
token, refresh = await auth.authenticate(user_token=code)
|
||||
helper = ConfigurationHelper()
|
||||
helper.createOrUpdate('twitch_access_token', token)
|
||||
helper.createOrUpdate('twitch_refresh_token', refresh)
|
||||
db.session.commit()
|
||||
except TwitchAPIException as e:
|
||||
logging(e)
|
||||
return redirect(url_for('openConfigurations'))
|
||||