11require  'omniauth-oauth2' 
22
33module  ::OmniAuth 
4+  module  OpenIDConnect 
5+  class  DiscoveryError  < Error ;  end 
6+  end 
7+ 
48 module  Strategies 
59 class  OpenIDConnect  < OmniAuth ::Strategies ::OAuth2 
610 option  :scope ,  "openid" 
711 option  :discovery ,  true 
12+  option  :use_userinfo ,  true 
813 option  :cache ,  lambda  {  |key ,  &blk | blk . call  }  # Default no-op cache 
914 option  :error_handler ,  lambda  {  |error ,  message | nil  }  # Default no-op handler 
10-  option  :authorize_options  ,  [ :p ] 
11-  option  :token_options  ,  [ :p ] 
15+  option  :passthrough_authorize_options  ,  [ :p ] 
16+  option  :passthrough_token_options  ,  [ :p ] 
1217
1318 option  :client_options , 
14-  site : 'https://op.com/' , 
15-  authorize_url : 'authorize' , 
16-  token_url : 'token' , 
17-  userinfo_endpoint : 'userinfo' , 
19+  discovery_document : nil , 
20+  site : nil , 
21+  authorize_url : nil , 
22+  token_url : nil , 
23+  userinfo_endpoint : nil , 
1824 auth_scheme : :basic_auth 
1925
2026 def  discover! 
2127 discovery_document  =  options . cache . call ( "openid_discovery_#{ options [ :client_options ] [ :discovery_document ] }  )  do 
2228 client . request ( :get ,  options [ :client_options ] [ :discovery_document ] ,  parse : :json ) . parsed 
2329 end 
24-  options [ :client_options ] [ :authorize_url ]  =  discovery_document [ "authorization_endpoint" ] . to_s 
25-  options [ :client_options ] [ :token_url ]  =  discovery_document [ "token_endpoint" ] . to_s 
26-  options [ :client_options ] [ :userinfo_endpoint ]  =  discovery_document [ "userinfo_endpoint" ] . to_s 
27-  options [ :client_options ] [ :site ]  =  discovery_document [ "issuer" ] . to_s 
30+ 
31+  { 
32+  authorize_url : "authorization_endpoint" , 
33+  token_url : "token_endpoint" , 
34+  site : "issuer" 
35+  } . each  do  |internal_key ,  external_key |
36+  val  =  discovery_document [ external_key ] . to_s 
37+  raise  ::OmniAuth ::OpenIDConnect ::DiscoveryError . new ( "missing discovery parameter #{ external_key }  )  if  val . nil?  || val . empty? 
38+  options [ :client_options ] [ internal_key ]  =  val 
39+  end 
40+ 
41+  userinfo_endpoint  =  options [ :client_options ] [ :userinfo_endpoint ]  =  discovery_document [ "userinfo_endpoint" ] . to_s 
42+  if  userinfo_endpoint . nil?  || userinfo_endpoint . empty? 
43+  options . use_userinfo  =  false 
44+  end 
2845 end 
2946
3047 def  request_phase 
@@ -34,14 +51,14 @@ def request_phase
3451
3552 def  authorize_params 
3653 super . tap  do  |params |
37-  options [ :authorize_options  ] . each  do  |k |
54+  options [ :passthrough_authorize_options  ] . each  do  |k |
3855 params [ k ]  =  request . params [ k . to_s ]  unless  [ nil ,  '' ] . include? ( request . params [ k . to_s ] ) 
3956 end 
4057
4158 params [ :scope ]  =  options [ :scope ] 
4259 session [ 'omniauth.nonce' ]  =  params [ :nonce ]  =  SecureRandom . hex ( 32 ) 
4360
44-  options [ :token_options  ] . each  do  |k |
61+  options [ :passthrough_token_options  ] . each  do  |k |
4562 session [ "omniauth.param.#{ k }  ]  =  request . params [ k . to_s ]  unless  [ nil ,  '' ] . include? ( request . params [ k . to_s ] ) 
4663 end 
4764 end 
@@ -95,8 +112,15 @@ def callback_phase
95112 if  request . params [ "error" ]  && request . params [ "error_description" ]  && response  =  options . error_handler . call ( request . params [ "error" ] ,  request . params [ "error_description" ] ) 
96113 return  redirect ( response ) 
97114 end 
98-  discover!  if  options [ :discovery ] 
115+ 
116+  begin 
117+  discover!  if  options [ :discovery ] 
118+  rescue  ::OmniAuth ::OpenIDConnect ::DiscoveryError  =>  e 
119+  fail! ( :openid_connect_discovery_error ,  e ) 
120+  end 
121+ 
99122 oauth2_callback_phase  =  super 
123+ 
100124 return  oauth2_callback_phase  if  env [ 'omniauth.error' ] 
101125
102126 if  id_token_info [ "nonce" ] . empty?  || id_token_info [ "nonce" ]  != session . delete ( "omniauth.nonce" ) 
@@ -113,7 +137,7 @@ def callback_url
113137
114138 def  token_params 
115139 params  =  { } 
116-  options [ :token_options  ] . each  do  |k |
140+  options [ :passthrough_token_options  ] . each  do  |k |
117141 val  =  session . delete ( "omniauth.param.#{ k }  ) 
118142 params [ k ]  =  val  unless  [ nil ,  '' ] . include? ( val ) 
119143 end 
0 commit comments