2121AUTH_STATE_KEY = 'auth_state'
2222USER_INFO_KEY = 'user_info'
2323
24- app = flask .Flask (__name__ )
24+ app = flask .Flask (__name__ )
2525app .secret_key = os .environ .get ("FN_FLASK_SECRET_KEY" , default = False )
2626
2727@app .route ('/' )
@@ -46,20 +46,35 @@ def no_cache_impl(*args, **kwargs):
4646@app .route ('/google/login' )
4747@no_cache
4848def login ():
49- session = OAuth2Session (CLIENT_ID , CLIENT_SECRET , scope = AUTHORIZATION_SCOPE , redirect_uri = AUTH_REDIRECT_URI )
49+ session = OAuth2Session (CLIENT_ID , CLIENT_SECRET ,
50+ scope = AUTHORIZATION_SCOPE ,
51+ redirect_uri = AUTH_REDIRECT_URI )
52+
5053 uri , state = session .authorization_url (AUTHORIZATION_URL )
54+
5155 flask .session [AUTH_STATE_KEY ] = state
5256 flask .session .permanent = True
53- return flask .redirect (uri , code = 302 )
5457
58+ return flask .redirect (uri , code = 302 )
5559
5660@app .route ('/google/auth' )
5761@no_cache
5862def google_auth_redirect ():
59- state = flask .request .args .get ('state' , default = None , type = None )
63+ req_state = flask .request .args .get ('state' , default = None , type = None )
64+
65+ if req_state != flask .session [AUTH_STATE_KEY ]:
66+ response = flask .make_response ('Invalid state parameter' , 401 )
67+ return response
6068
61- session = OAuth2Session (CLIENT_ID , CLIENT_SECRET , scope = AUTHORIZATION_SCOPE , state = state , redirect_uri = AUTH_REDIRECT_URI )
62- oauth2_tokens = session .fetch_access_token (ACCESS_TOKEN_URI , authorization_response = flask .request .url )
69+ session = OAuth2Session (CLIENT_ID , CLIENT_SECRET ,
70+ scope = AUTHORIZATION_SCOPE ,
71+ state = flask .session [AUTH_STATE_KEY ],
72+ redirect_uri = AUTH_REDIRECT_URI )
73+
74+ oauth2_tokens = session .fetch_access_token (
75+ ACCESS_TOKEN_URI ,
76+ authorization_response = flask .request .url )
77+
6378 flask .session [AUTH_TOKEN_KEY ] = oauth2_tokens
6479
6580 return flask .redirect (BASE_URI , code = 302 )
@@ -81,14 +96,19 @@ def build_credentials():
8196 raise Exception ('User must be logged in' )
8297
8398 oauth2_tokens = flask .session [AUTH_TOKEN_KEY ]
99+
84100 return google .oauth2 .credentials .Credentials (
85- oauth2_tokens ['access_token' ],
86- refresh_token = oauth2_tokens ['refresh_token' ],
87- client_id = CLIENT_ID ,
88- client_secret = CLIENT_SECRET ,
89- token_uri = ACCESS_TOKEN_URI )
101+ oauth2_tokens ['access_token' ],
102+ refresh_token = oauth2_tokens ['refresh_token' ],
103+ client_id = CLIENT_ID ,
104+ client_secret = CLIENT_SECRET ,
105+ token_uri = ACCESS_TOKEN_URI )
90106
91107def get_user_info ():
92108 credentials = build_credentials ()
93- oauth2_client = googleapiclient .discovery .build ('oauth2' , 'v2' , credentials = credentials )
109+
110+ oauth2_client = googleapiclient .discovery .build (
111+ 'oauth2' , 'v2' ,
112+ credentials = credentials )
113+
94114 return oauth2_client .userinfo ().get ().execute ()
0 commit comments