@@ -78,30 +78,26 @@ def token_params
7878 super . merge ( params )
7979 end
8080
81- uid { id_token_info [ 'sub' ] }
81+ def callback_phase
82+ if request . params [ "error" ] && request . params [ "error_description" ] && response = options . error_handler . call ( request . params [ "error" ] , request . params [ "error_description" ] )
83+ return redirect ( response )
84+ end
8285
83- info do
84- data_source = options . use_userinfo ? userinfo_response : id_token_info
85- prune! (
86- name : data_source [ 'name' ] ,
87- email : data_source [ 'email' ] ,
88- first_name : data_source [ 'given_name' ] ,
89- last_name : data_source [ 'family_name' ] ,
90- nickname : data_source [ 'preferred_username' ] ,
91- picture : data_source [ 'picture' ]
92- )
93- end
86+ begin
87+ discover! if options [ :discovery ]
9488
95- extra do
96- hash = { }
97- hash [ :raw_info ] = options . use_userinfo ? userinfo_response : id_token_info
98- prune! hash
99- end
89+ oauth2_callback_phase = super
90+ return oauth2_callback_phase if env [ 'omniauth.error' ]
10091
101- def userinfo_response
102- @raw_info ||= access_token . get ( options [ :client_options ] [ :userinfo_endpoint ] ) . parsed
103- return fail! ( :csrf_detected , CallbackError . new ( :csrf_detected , "CSRF detected" ) ) unless @raw_info [ 'sub' ] == id_token_info [ 'sub' ]
104- @raw_info
92+ if id_token_info [ "nonce" ] . nil? || id_token_info [ "nonce" ] . empty? || id_token_info [ "nonce" ] != session . delete ( "omniauth.nonce" )
93+ return fail! ( :csrf_detected , CallbackError . new ( :csrf_detected , "CSRF detected" ) )
94+ end
95+ oauth2_callback_phase
96+ rescue ::OmniAuth ::OpenIDConnect ::DiscoveryError => e
97+ fail! ( :openid_connect_discovery_error , e )
98+ rescue JWT ::DecodeError => e
99+ fail! ( :jwt_decode_failed , e )
100+ end
105101 end
106102
107103 def id_token_info
@@ -122,25 +118,30 @@ def id_token_info
122118 ) . first
123119 end
124120
125- def callback_phase
126- if request . params [ "error" ] && request . params [ "error_description" ] && response = options . error_handler . call ( request . params [ "error" ] , request . params [ "error_description" ] )
127- return redirect ( response )
128- end
129-
130- begin
131- discover! if options [ :discovery ]
132- rescue ::OmniAuth ::OpenIDConnect ::DiscoveryError => e
133- fail! ( :openid_connect_discovery_error , e )
134- end
121+ def userinfo_response
122+ @raw_info ||= access_token . get ( options [ :client_options ] [ :userinfo_endpoint ] ) . parsed
123+ return fail! ( :csrf_detected , CallbackError . new ( :csrf_detected , "CSRF detected" ) ) unless @raw_info [ 'sub' ] == id_token_info [ 'sub' ]
124+ @raw_info
125+ end
135126
136- oauth2_callback_phase = super
127+ uid { id_token_info [ 'sub' ] }
137128
138- return oauth2_callback_phase if env [ 'omniauth.error' ]
129+ info do
130+ data_source = options . use_userinfo ? userinfo_response : id_token_info
131+ prune! (
132+ name : data_source [ 'name' ] ,
133+ email : data_source [ 'email' ] ,
134+ first_name : data_source [ 'given_name' ] ,
135+ last_name : data_source [ 'family_name' ] ,
136+ nickname : data_source [ 'preferred_username' ] ,
137+ picture : data_source [ 'picture' ]
138+ )
139+ end
139140
140- if id_token_info [ "nonce" ] . empty? || id_token_info [ "nonce" ] != session . delete ( "omniauth.nonce" )
141- return fail! ( :csrf_detected , CallbackError . new ( :csrf_detected , "CSRF detected" ) )
142- end
143- oauth2_callback_phase
141+ extra do
142+ hash = { }
143+ hash [ :raw_info ] = options . use_userinfo ? userinfo_response : id_token_info
144+ prune! hash
144145 end
145146
146147 private
@@ -169,7 +170,7 @@ def prune!(hash)
169170
170171 def build_access_token
171172 return super if options . use_userinfo
172- response = client . request ( :get , options [ :client_options ] [ :token_url ] , params : get_token_options )
173+ response = client . request ( :post , options [ :client_options ] [ :token_url ] , body : get_token_options )
173174 ::OAuth2 ::AccessToken . from_hash ( client , response . parsed )
174175 end
175176
0 commit comments