Authentication redirect sends user to a makeshift homepage json output as a placeholder.

This commit is contained in:
Ada Werefox 2023-02-23 05:28:41 +00:00
parent 83248bab22
commit ba3fc595c7
3 changed files with 60 additions and 29 deletions

View File

@ -1,6 +1,7 @@
from flask import Flask, render_template, url_for, redirect, request from urllib.parse import urlparse
from authlib.integrations.flask_client import OAuth
from secrets import token_urlsafe from secrets import token_urlsafe
from flask import Flask, render_template, url_for, redirect, request, make_response, session
from authlib.integrations.flask_client import OAuth
from requests import post from requests import post
app = Flask(__name__) app = Flask(__name__)
@ -8,6 +9,7 @@ app = Flask(__name__)
SECRET_KEY = token_urlsafe(32) SECRET_KEY = token_urlsafe(32)
app.secret_key = SECRET_KEY app.secret_key = SECRET_KEY
cache = OAuthCache()
oauth = OAuth(app) oauth = OAuth(app)
gotosocial = oauth.register( gotosocial = oauth.register(
@ -31,40 +33,60 @@ def index():
@app.route('/set_domain', methods=['POST']) @app.route('/set_domain', methods=['POST'])
def set_domain(): def set_domain():
if(request.method == 'POST'): if(request.method == 'POST'):
try:
domain_parse = urlparse(request.form["domain"])
if(domain_parse):
if(domain_parse.scheme):
domain = domain.geturl()
else:
domain = f'https://{domain_parse.geturl()}'
payload = { payload = {
'client_name':'gotosocial-fe', 'client_name':'gotosocial-fe',
'redirect_uris':url_for('index', _external=True) 'redirect_uris':url_for('index', _external=True)
} }
response = post(f'https://{request.form["domain"]}/api/v1/apps', data=payload) response = post(f'{domain}/api/v1/apps', data=payload)
client_data = response.json() client_data = response.json()
gotosocial.client_id = client_data['client_id'] oauth.gotosocial.client_id = client_data['client_id']
gotosocial.client_secret = client_data['client_secret'] oauth.gotosocial.client_secret = client_data['client_secret']
gotosocial.access_token_params = { oauth.gotosocial.access_token_params = {
'response_type':'token', 'response_type':'token',
'grant_type':'authorization_code', 'grant_type':'authorization_code',
'client_id':client_data['client_id'], 'client_id':client_data['client_id'],
'client_secret':client_data['client_secret'] 'client_secret':client_data['client_secret']
} }
gotosocial.access_token_url = f'https://{request.form["domain"]}{gotosocial.access_token_url}' oauth.gotosocial.access_token_url = f'{domain}{oauth.gotosocial.access_token_url}'
gotosocial.authorize_url = f'https://{request.form["domain"]}{gotosocial.authorize_url}' oauth.gotosocial.authorize_url = f'{domain}{oauth.gotosocial.authorize_url}'
gotosocial.api_base_url = f'https://{request.form["domain"]}{gotosocial.api_base_url}' oauth.gotosocial.api_base_url = f'{domain}{oauth.gotosocial.api_base_url}'
return redirect('/login') return redirect('/login')
else:
return "Did you even submit anything?"
except:
return "Are you sure you're putting in a GoToSocial instance url?"
else: else:
return "Sorry, but you can't get *GET* /set_domain, hun." return "Sorry, but you can't get *GET* /set_domain, hun."
@app.route('/login') @app.route('/login')
def login(): def login():
redirect_uri = url_for('authorize', _external=True) redirect_uri = url_for('authorize', _external=True)
return gotosocial.authorize_redirect(redirect_uri) return oauth.gotosocial.authorize_redirect(redirect_uri)
@app.route('/authorize') @app.route('/authorize')
def authorize(): def authorize():
token = gotosocial.authorize_access_token() token = oauth.gotosocial.authorize_access_token()
print(token) session['oauth_token'] = token
response = gotosocial.get( response = oauth.gotosocial.get(
'api/v1/accounts/verify_credentials', token=token) 'api/v1/accounts/verify_credentials')
response.raise_for_status() response.raise_for_status()
account_info = response.json() return redirect(url_for('home', _external=True))
return account_info
@app.route('/home')
def home():
# If we're here, assume that we already authenticated for now.
token = session['oauth_token']
# TODO: Long-term shoukd make sure we store the token in localStorage and try to retrieve it there first.
response = oauth.gotosocial.get(
'api/v1/timelines/home', token=token)
response.raise_for_status()
home_timeline = response.json()
return home_timeline # render_template('index.html')

9
app/templates/home/index.html Executable file
View File

@ -0,0 +1,9 @@
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>

View File

@ -7,8 +7,8 @@ services:
build: . build: .
volumes: volumes:
- ./app:/var/www/app - ./app:/var/www/app
#environment: environment:
# - - PYTHONUNBUFFERED=1
ports: ports:
- 5000:5000 - 5000:5000
command: 'sh -c "cd app && flask run --host=0.0.0.0"' command: 'sh -c "cd app && flask run --host=0.0.0.0"'