1- """Auth0's sample server
1+ """Python Flask WebApp Auth0 integration example
22"""
33from functools import wraps
4- import os
4+ from os import environ as env , path
5+ import json
56
6- from dotenv import Dotenv
7+ from auth0 .v3 .authentication import GetToken
8+ from auth0 .v3 .authentication import Users
9+ from dotenv import load_dotenv
710from flask import Flask
811from flask import redirect
912from flask import render_template
1013from flask import request
1114from flask import send_from_directory
1215from flask import session
13- import requests
1416
1517import constants
1618
17- # Load Env variables
18- env = None
19+ load_dotenv (path .join (path .dirname (__file__ ), ".env" ))
20+ API_AUDIENCE = env [constants .API_ID ]
21+ AUTH0_CALLBACK_URL = env [constants .AUTH0_CALLBACK_URL ]
22+ AUTH0_CLIENT_ID = env [constants .AUTH0_CLIENT_ID ]
23+ AUTH0_CLIENT_SECRET = env [constants .AUTH0_CLIENT_SECRET ]
24+ AUTH0_DOMAIN = env [constants .AUTH0_DOMAIN ]
1925
20- try :
21- env = Dotenv ('./.env' )
22- except IOError :
23- env = os .environ
26+ APP = Flask (__name__ , static_url_path = '' )
27+ APP .secret_key = constants .SECRET_KEY
28+ APP .debug = True
2429
25- app = Flask (__name__ , static_url_path = '' )
26- app .secret_key = constants .SECRET_KEY
27- app .debug = True
2830
29-
30- # Requires authentication decorator
3131def requires_auth (f ):
3232 @wraps (f )
3333 def decorated (* args , ** kwargs ):
@@ -38,47 +38,33 @@ def decorated(*args, **kwargs):
3838
3939
4040# Controllers API
41- @app .route ('/' )
41+ @APP .route ('/' )
4242def home ():
4343 return render_template ('home.html' , env = env )
4444
4545
46- @app .route ('/dashboard' )
46+ @APP .route ('/dashboard' )
4747@requires_auth
4848def dashboard ():
4949 return render_template ('dashboard.html' ,
5050 user = session [constants .PROFILE_KEY ])
5151
5252
53- @app .route ('/public/<path:filename>' )
53+ @APP .route ('/public/<path:filename>' )
5454def static_files (filename ):
5555 return send_from_directory ('./public' , filename )
5656
5757
58- @app .route ('/callback' )
58+ @APP .route ('/callback' )
5959def callback_handling ():
6060 code = request .args .get (constants .CODE_KEY )
61- json_header = {constants .CONTENT_TYPE_KEY : constants .APP_JSON_KEY }
62- token_url = 'https://{auth0_domain}/oauth/token' .format (
63- auth0_domain = env [constants .AUTH0_DOMAIN ])
64- token_payload = {
65- constants .CLIENT_ID_KEY : env [constants .AUTH0_CLIENT_ID ],
66- constants .CLIENT_SECRET_KEY : env [constants .AUTH0_CLIENT_SECRET ],
67- constants .REDIRECT_URI_KEY : env [constants .AUTH0_CALLBACK_URL ],
68- constants .CODE_KEY : code ,
69- constants .GRANT_TYPE_KEY : constants .AUTHORIZATION_CODE_KEY
70- }
71-
72- token_info = requests .post (token_url , json = token_payload ,
73- headers = json_header ).json ()
74-
75- user_url = 'https://{auth0_domain}/userinfo?access_token={access_token}' \
76- .format (auth0_domain = env [constants .AUTH0_DOMAIN ],
77- access_token = token_info [constants .ACCESS_TOKEN_KEY ])
78-
79- user_info = requests .get (user_url ).json ()
80- session [constants .PROFILE_KEY ] = user_info
61+ get_token = GetToken (AUTH0_DOMAIN )
62+ auth0_users = Users (AUTH0_DOMAIN )
63+ token = get_token .authorization_code (AUTH0_CLIENT_ID ,
64+ AUTH0_CLIENT_SECRET , code , AUTH0_CALLBACK_URL )
65+ user_info = auth0_users .userinfo (token ['access_token' ])
66+ session [constants .PROFILE_KEY ] = json .loads (user_info )
8167 return redirect ('/dashboard' )
8268
8369if __name__ == "__main__" :
84- app .run (host = '0.0.0.0' , port = os . environ .get ('PORT' , 3000 ))
70+ APP .run (host = '0.0.0.0' , port = env .get ('PORT' , 3000 ))
0 commit comments