diff --git a/.gitignore b/.gitignore index b6e4761..a731b3c 100644 --- a/.gitignore +++ b/.gitignore @@ -127,3 +127,6 @@ dmypy.json # Pyre type checker .pyre/ + +config.json +.idea/ \ No newline at end of file diff --git a/web/Oauth2.py b/web/Oauth2.py new file mode 100644 index 0000000..21c0ce8 --- /dev/null +++ b/web/Oauth2.py @@ -0,0 +1,112 @@ +import os, json +from flask import Flask, g, session, redirect, request, url_for, jsonify, make_response, render_template +from requests_oauthlib import OAuth2Session + +with open("config.json", "r") as f: + config = json.load(f) + +OAUTH2_CLIENT_ID = config["OAUTH2_CLIENT_ID"] +OAUTH2_CLIENT_SECRET = config["OAUTH2_CLIENT_SECRET"] +OAUTH2_REDIRECT_URI = config["OAUTH2_REDIRECT_URI"] + +API_BASE_URL = os.environ.get('API_BASE_URL', 'https://discordapp.com/api') +AUTHORIZATION_BASE_URL = API_BASE_URL + '/oauth2/authorize' +TOKEN_URL = API_BASE_URL + '/oauth2/token' + +app = Flask(__name__, template_folder=config['HTML_TEMPLATES']) +app.debug = True +app.config['SECRET_KEY'] = OAUTH2_CLIENT_SECRET + +base_url = "http://127.0.0.1:47670" + +token_transfer = [] + +if 'http://' in OAUTH2_REDIRECT_URI: + os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = 'true' + + +def token_updater(token): + session['oauth2_token'] = token + + +def local_redirect(address): + return base_url + address + + +def make_session(token=None, state=None, scope=None): + return OAuth2Session( + client_id=OAUTH2_CLIENT_ID, + token=token, + state=state, + scope=scope, + redirect_uri=OAUTH2_REDIRECT_URI, + auto_refresh_kwargs={ + 'client_id': OAUTH2_CLIENT_ID, + 'client_secret': OAUTH2_CLIENT_SECRET, + }, + auto_refresh_url=TOKEN_URL, + token_updater=token_updater) + + +@app.route('/') +def main(): + print(session) + if "userInfo" in session: + print("User has previous session") + return redirect(local_redirect("/home"), 302) + else: + print("User does not have previous session") + return redirect(local_redirect("/link"), 302) + + +@app.route('/home') +def home(): + try: + return render_template('home.html', user=session["userInfo"]["username"]) + except KeyError: + print("User's previous session is invalid") + return redirect(local_redirect("/link"), 302) + + +@app.route('/link') +def link(): + scope = request.args.get( + 'scope', + 'identify guilds') + discord = make_session(scope=scope.split(' ')) + authorization_url, state = discord.authorization_url(AUTHORIZATION_BASE_URL) + session['oauth2_state'] = state + print(session) + return redirect(authorization_url, 302) + + +@app.route('/callback') +def callback(): + global token_transfer + if request.values.get('error'): + return request.values['error'] + discord = make_session(state=session.get('oauth2_state')) + token = discord.fetch_token( + TOKEN_URL, + client_secret=OAUTH2_CLIENT_SECRET, + authorization_response=request.url) + token_transfer = token + print(session) + return redirect(local_redirect("/me"), 302) + + +@app.route('/me/') +def me(): + session['oauth2_token'] = token_transfer + discord = make_session(token=session.get('oauth2_token')) + user = discord.get(API_BASE_URL + '/users/@me').json() + guilds = discord.get(API_BASE_URL + '/users/@me/guilds').json() + + session['userInfo'] = user + session['guildInfo'] = guilds + + return redirect(local_redirect("/"), 302) + + +if __name__ == '__main__': + app.run(port=47670) \ No newline at end of file