Ich hatte heute das Problem, dass ich mit Authlib keinen Zugriff auf die Google API bekam. Nach langem Knobeln hier die Lösung, welche Flask als Webinterface benutzt:
from flask import Flask, render_template, session, request, redirect, url_for, abort, jsonify
from authlib.client import OAuth2Session
import json
GOOGLE_CLIENT_ID = "client-id"
GOOGLE_CLIENT_SECRET = "client-secret"
REDIRECT_URI = 'http://localhost:8080/oauth2callback'
SCOPE = 'https://www.googleapis.com/auth/calendar'
AUTHORIZE_URL = 'https://accounts.google.com/o/oauth2/auth'
app = Flask(__name__)
client = OAuth2Session(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, redirect_uri=REDIRECT_URI, scope=SCOPE)
@app.route('/login')
def login():
auth_uri, state = client.authorization_url(AUTHORIZE_URL)
session['state'] = state
return redirect(auth_uri)
@app.route('/oauth2callback')
def oauth2callback():
state = request.args.get('state')
assert state == session['state']
access_token_url = 'https://accounts.google.com/o/oauth2/token'
token = client.fetch_access_token(access_token_url, authorization_response=request.url)
userdata = {'user_id': session['user_id'], 'token': token}
return json.dumps(userdata)
@app.route('/')
@app.route('/')
def index(user_id = 0):
session['user_id'] = user_id
return redirect(url_for('login'))
if __name__ == '__main__':
app.secret_key = 'hello world'
app.run(host='localhost', port=8080)
Die oberen Konstanten (Client-ID, Client-Secret) sind natürlich anzupassen.
Der Vorteil dieser Lösung ist, dass man den Token in der oauth2callback() Funktion in einer DB ablegen kann. In Verbindung mit der dynamischen Einstiegsroute (z.B. für die ID 1234: localhost:8080/1234) und Ablage in der Session kann man so Tokens zu User IDs zuordnen und speichern.