Gestion de l'authentification pour le access token et refresh_token

This commit is contained in:
Kepka Ludovic
2025-08-28 17:15:33 +02:00
committed by skylanix
parent 641ff40716
commit 582ea35c3c
11 changed files with 67 additions and 28 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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')}')

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -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>

View File

@@ -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
View 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'))