11"""Python Flask WebApp Auth0 integration example
22"""
3- from functools import wraps
3+
44import json
55from os import environ as env
6- from werkzeug . exceptions import HTTPException
6+ from urllib . parse import quote_plus , urlencode
77
8- from dotenv import load_dotenv , find_dotenv
9- from flask import Flask
10- from flask import jsonify
11- from flask import redirect
12- from flask import render_template
13- from flask import session
14- from flask import url_for
158from authlib .integrations .flask_client import OAuth
16- from six . moves . urllib . parse import urlencode
17-
18- import constants
9+ from dotenv import find_dotenv , load_dotenv
10+ from flask import Flask , jsonify , redirect , render_template , session , url_for
11+ from werkzeug . exceptions import HTTPException
1912
2013ENV_FILE = find_dotenv ()
2114if ENV_FILE :
2215 load_dotenv (ENV_FILE )
2316
24- AUTH0_CALLBACK_URL = env .get (constants .AUTH0_CALLBACK_URL )
25- AUTH0_CLIENT_ID = env .get (constants .AUTH0_CLIENT_ID )
26- AUTH0_CLIENT_SECRET = env .get (constants .AUTH0_CLIENT_SECRET )
27- AUTH0_DOMAIN = env .get (constants .AUTH0_DOMAIN )
28- AUTH0_BASE_URL = "https://" + AUTH0_DOMAIN
29- AUTH0_AUDIENCE = env .get (constants .AUTH0_AUDIENCE )
30-
3117app = Flask (__name__ , static_url_path = "/public" , static_folder = "./public" )
32- app .secret_key = constants . SECRET_KEY
18+ app .secret_key = env . get ( "APP_SECRET_KEY" )
3319app .debug = True
3420
3521
@@ -40,34 +26,40 @@ def handle_auth_error(ex):
4026 return response
4127
4228
29+ def fetch_token (name , request ):
30+ token = OAuth2Token .find (name = name , user = request .user )
31+ return token .to_token ()
32+
33+
4334oauth = OAuth (app )
4435
4536auth0 = oauth .register (
4637 "auth0" ,
47- client_id = AUTH0_CLIENT_ID ,
48- client_secret = AUTH0_CLIENT_SECRET ,
49- api_base_url = AUTH0_BASE_URL ,
50- access_token_url = AUTH0_BASE_URL + "/oauth/token" ,
51- authorize_url = AUTH0_BASE_URL + "/authorize" ,
38+ client_id = env . get ( " AUTH0_CLIENT_ID" ) ,
39+ client_secret = env . get ( " AUTH0_CLIENT_SECRET" ) ,
40+ api_base_url = "https://" + env . get ( "AUTH0_DOMAIN" ) ,
41+ access_token_url = "https://" + env . get ( "AUTH0_DOMAIN" ) + "/oauth/token" ,
42+ authorize_url = "https://" + env . get ( "AUTH0_DOMAIN" ) + "/authorize" ,
5243 client_kwargs = {
5344 "scope" : "openid profile email" ,
5445 },
46+ server_metadata_url = "https://"
47+ + env .get ("AUTH0_DOMAIN" )
48+ + "/.well-known/openid-configuration" ,
49+ fetch_token = fetch_token ,
5550)
5651
5752
58- def requires_auth (f ):
59- @wraps (f )
60- def decorated (* args , ** kwargs ):
61- if constants .PROFILE_KEY not in session :
62- return redirect ("/login" )
63- return f (* args , ** kwargs )
64-
65- return decorated
66-
67-
6853# Controllers API
6954@app .route ("/" )
7055def home ():
56+ if "profile" in session :
57+ return render_template (
58+ "dashboard.html" ,
59+ userinfo = session ["profile" ],
60+ userinfo_pretty = json .dumps (session ["jwt_payload" ], indent = 4 ),
61+ )
62+
7163 return render_template ("home.html" )
7264
7365
@@ -77,36 +69,35 @@ def callback_handling():
7769 resp = auth0 .get ("userinfo" )
7870 userinfo = resp .json ()
7971
80- session [constants . JWT_PAYLOAD ] = userinfo
81- session [constants . PROFILE_KEY ] = {
72+ session ["jwt_payload" ] = userinfo
73+ session ["profile" ] = {
8274 "user_id" : userinfo ["sub" ],
8375 "name" : userinfo ["name" ],
8476 "picture" : userinfo ["picture" ],
8577 }
86- return redirect ("/dashboard " )
78+ return redirect ("/" )
8779
8880
8981@app .route ("/login" )
9082def login ():
9183 return auth0 .authorize_redirect (
92- redirect_uri = AUTH0_CALLBACK_URL , audience = AUTH0_AUDIENCE
84+ redirect_uri = env . get ( " AUTH0_CALLBACK_URL" ) , audience = env . get ( " AUTH0_AUDIENCE" )
9385 )
9486
9587
9688@app .route ("/logout" )
9789def logout ():
9890 session .clear ()
99- params = {"returnTo" : url_for ("home" , _external = True ), "client_id" : AUTH0_CLIENT_ID }
100- return redirect (auth0 .api_base_url + "/v2/logout?" + urlencode (params ))
101-
102-
103- @app .route ("/dashboard" )
104- @requires_auth
105- def dashboard ():
106- return render_template (
107- "dashboard.html" ,
108- userinfo = session [constants .PROFILE_KEY ],
109- userinfo_pretty = json .dumps (session [constants .JWT_PAYLOAD ], indent = 4 ),
91+ return redirect (
92+ auth0 .api_base_url
93+ + "/v2/logout?"
94+ + urlencode (
95+ {
96+ "returnTo" : url_for ("home" , _external = True ),
97+ "client_id" : env .get ("AUTH0_CLIENT_ID" ),
98+ },
99+ quote_via = quote_plus ,
100+ )
110101 )
111102
112103
0 commit comments