11"""Python Flask WebApp Auth0 integration example
22"""
33from functools import wraps
4- from urllib .parse import urlparse
5- from os import environ as env , path
6- import json
7-
8- from auth0 .v3 .authentication import GetToken
9- from auth0 .v3 .authentication import Users
10- from dotenv import load_dotenv
4+ from urllib .parse import urlencode
5+ from os import environ as env
6+ from dotenv import load_dotenv , find_dotenv
117from flask import Flask
128from flask import redirect
139from flask import render_template
1410from flask import request
1511from flask import send_from_directory
1612from flask import session
13+ from flask import url_for
14+ from flask_oauthlib .client import OAuth
1715
1816import constants
1917
20- load_dotenv (path . join ( path . dirname ( __file__ ), ".env" ))
18+ load_dotenv (find_dotenv ( ))
2119AUTH0_CALLBACK_URL = env [constants .AUTH0_CALLBACK_URL ]
2220AUTH0_CLIENT_ID = env [constants .AUTH0_CLIENT_ID ]
2321AUTH0_CLIENT_SECRET = env [constants .AUTH0_CLIENT_SECRET ]
2422AUTH0_DOMAIN = env [constants .AUTH0_DOMAIN ]
23+ AUTH0_AUDIENCE = env .get (constants .AUTH0_AUDIENCE )
2524
2625APP = Flask (__name__ , static_url_path = '' )
2726APP .secret_key = constants .SECRET_KEY
2827APP .debug = True
28+ oauth = OAuth (APP )
29+
2930
31+ auth0 = oauth .remote_app (
32+ 'auth0' ,
33+ consumer_key = AUTH0_CLIENT_ID ,
34+ consumer_secret = AUTH0_CLIENT_SECRET ,
35+ request_token_params = {
36+ 'scope' : 'openid profile' ,
37+ 'audience' : AUTH0_AUDIENCE
38+ },
39+ base_url = 'https://%s' % AUTH0_DOMAIN ,
40+ access_token_method = 'POST' ,
41+ access_token_url = '/oauth/token' ,
42+ authorize_url = '/authorize' ,
43+ )
3044
3145def requires_auth (f ):
3246 @wraps (f )
@@ -40,6 +54,9 @@ def decorated(*args, **kwargs):
4054# Controllers API
4155@APP .route ('/' )
4256def home ():
57+ if constants .PROFILE_KEY in session :
58+ return redirect (url_for ('dashboard' ))
59+
4360 return render_template ('home.html' , env = env )
4461
4562
@@ -52,9 +69,8 @@ def dashboard():
5269@APP .route ('/logout' )
5370def logout ():
5471 session .clear ()
55- parsed_base_url = urlparse (AUTH0_CALLBACK_URL )
56- base_url = parsed_base_url .scheme + '://' + parsed_base_url .netloc
57- return redirect ('https://%s/v2/logout?returnTo=%s&client_id=%s' % (AUTH0_DOMAIN , base_url , AUTH0_CLIENT_ID ))
72+ params = {'returnTo' : url_for ('home' , _external = True ), 'client_id' : AUTH0_CLIENT_ID }
73+ return redirect (auth0 .base_url + '/v2/logout?' + urlencode (params ))
5874
5975@APP .route ('/public/<path:filename>' )
6076def static_files (filename ):
@@ -63,14 +79,30 @@ def static_files(filename):
6379
6480@APP .route ('/callback' )
6581def callback_handling ():
66- code = request .args .get (constants .CODE_KEY )
67- get_token = GetToken (AUTH0_DOMAIN )
68- auth0_users = Users (AUTH0_DOMAIN )
69- token = get_token .authorization_code (AUTH0_CLIENT_ID ,
70- AUTH0_CLIENT_SECRET , code , AUTH0_CALLBACK_URL )
71- user_info = auth0_users .userinfo (token ['access_token' ])
72- session [constants .PROFILE_KEY ] = json .loads (user_info )
82+ resp = auth0 .authorized_response ()
83+ if resp is None :
84+ return 'Access denied: reason=%s error=%s' % (
85+ request .args ['error_reason' ],
86+ request .args ['error_description' ]
87+ )
88+
89+ session ['access_token' ] = (resp ['access_token' ], '' )
90+
91+ user_info = auth0 .get ('userinfo' )
92+ session [constants .PROFILE_KEY ] = user_info .data
93+
7394 return redirect ('/dashboard' )
7495
96+
97+ @APP .route ('/login' )
98+ def login ():
99+ return auth0 .authorize (callback = AUTH0_CALLBACK_URL )
100+
101+
102+ @auth0 .tokengetter
103+ def get_auth0_oauth_token ():
104+ return session .get ('access_token' )
105+
106+
75107if __name__ == "__main__" :
76108 APP .run (host = '0.0.0.0' , port = env .get ('PORT' , 3000 ))
0 commit comments