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
|
# Nécessaire pour l'hébergement du site web
|
||||||
flask>=2.3.2
|
flask>=2.3.2
|
||||||
flask-sqlalchemy>=3.0.3
|
flask-sqlalchemy>=3.0.3
|
||||||
|
flask[async]
|
||||||
waitress>=3.0.2
|
waitress>=3.0.2
|
||||||
|
|
||||||
# Nécessaire pour l'appel à l'API Humble Bundle
|
# Nécessaire pour l'appel à l'API Humble Bundle
|
||||||
|
|||||||
@@ -2,4 +2,4 @@ from flask import Flask
|
|||||||
|
|
||||||
webapp = Flask(__name__)
|
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")
|
@webapp.route("/configurations/twitch/help")
|
||||||
def twitchConfigurationHelp():
|
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') }}" />
|
<input name="twitch_client_id" type="text" value="{{ configuration.getValue('twitch_client_id') }}" />
|
||||||
<label for="twitch_client_secret">Client Secret</label>
|
<label for="twitch_client_secret">Client Secret</label>
|
||||||
<input name="twitch_client_secret" type="text" value="{{ configuration.getValue('twitch_client_secret') }}" />
|
<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>
|
<label for="twitch_channel">Chaîne à rejoindre</label>
|
||||||
<input name="twitch_channel" type="text" value="{{ configuration.getValue('twitch_channel') }}"
|
<input name="twitch_channel" type="text" value="{{ configuration.getValue('twitch_channel') }}"
|
||||||
placeholder="#machinTruc" />
|
placeholder="#machinTruc" />
|
||||||
@@ -29,6 +25,17 @@
|
|||||||
<p>
|
<p>
|
||||||
<a href="{{ url_for('twitchConfigurationHelp') }}">Aide</a>
|
<a href="{{ url_for('twitchConfigurationHelp') }}">Aide</a>
|
||||||
</p>
|
</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>
|
<p>Nécessite un redémarrage</p>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|||||||
@@ -4,13 +4,14 @@
|
|||||||
<h1>Procédure de configuration de Twitch</h1>
|
<h1>Procédure de configuration de Twitch</h1>
|
||||||
<p>
|
<p>
|
||||||
<strong>Avant toute chose, activez l'authentification à deux facteurs (2FA) :</strong>
|
<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>
|
<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>
|
||||||
<p>
|
<p>
|
||||||
Rendez-vous sur <a href="https://dev.twitch.tv/console" target="_blank">la console d'applications Twitch</a> et
|
Rendez-vous sur <a href="https://dev.twitch.tv/console" target="_blank">la console d'applications Twitch</a> et
|
||||||
ajoutez une application. Renseignez :
|
ajoutez une application. Renseignez :
|
||||||
<ul>
|
<ul>
|
||||||
<li>URL de redirection : https://twitchtokengenerator.com</li>
|
<li>URL de redirection : {{token_redirect_url}}</li>
|
||||||
<li>Catégorie : Chat Bot</li>
|
<li>Catégorie : Chat Bot</li>
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
@@ -25,25 +26,10 @@
|
|||||||
<img src="/static/img/twitch-api-02.jpg">
|
<img src="/static/img/twitch-api-02.jpg">
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Ensuite, rendez-vous sur <a href="https://twitchtokengenerator.com/" target="_blank">twitchtokengenerator.com</a> et
|
Ensuite, retourner sur la page de <a href="{{url_for('openConfigurations')}}">Configuration</a>, apres avoir
|
||||||
sélectionnez <strong>Custom Scope Target</strong>. Dans la section <strong>Use My Client Secret and Client
|
enregistret le <strong>Client ID</strong> et le <strong>Client Secret</strong>, cliquer sur le lien <strong>Obtenir
|
||||||
ID</strong>, renseignez les deux champs.
|
token et refresh token</strong>. Si tout se passe bien les champs <strong>Access Token</strong> et
|
||||||
|
<strong>Refresh Token</strong> sont rempli.
|
||||||
</p>
|
</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 %}
|
{% 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'))
|
||||||