@@ -141,6 +141,16 @@ defmodule Oidcc.Plug.AuthorizationCallback do
141141 | :state_not_verified
142142 | { :missing_request_param , param :: String . t ( ) }
143143
144+ # what Oidcc.Plug.Authorize writes into the session. peer_ip and useragent are
145+ # read back from the client, so the checks tolerate them being absent.
146+ @ typep session ( ) :: % {
147+ nonce: String . t ( ) ,
148+ peer_ip: :inet . ip_address ( ) | nil ,
149+ useragent: String . t ( ) | nil ,
150+ pkce_verifier: String . t ( ) ,
151+ state_verifier: integer ( )
152+ }
153+
144154 @ impl Plug
145155 def init ( opts ) ,
146156 do:
@@ -185,21 +195,15 @@ defmodule Oidcc.Plug.AuthorizationCallback do
185195 { :ok , code } <- fetch_request_param ( params , "code" ) ,
186196 scope = Map . get ( params , "scope" , "openid" ) ,
187197 token_opts =
188- prepare_retrieve_opts (
189- opts ,
190- scope ,
191- session . nonce ,
192- redirect_uri ,
193- session . pkce_verifier
194- ) ,
198+ prepare_retrieve_opts ( client_context , session , scope , redirect_uri , opts ) ,
195199 { :ok , token } <-
196200 retrieve_token (
197201 code ,
198202 client_context ,
199203 retrieve_userinfo? ,
200204 Map . merge ( profile_opts , token_opts )
201205 ) ,
202- userinfo_opts = prepare_userinfo_opts ( opts ) ,
206+ userinfo_opts = prepare_userinfo_opts ( client_context , opts ) ,
203207 { :ok , userinfo } <- retrieve_userinfo ( token , client_context , userinfo_opts , retrieve_userinfo? ) do
204208 { :ok , { token , userinfo } }
205209 end
@@ -217,44 +221,37 @@ defmodule Oidcc.Plug.AuthorizationCallback do
217221 end
218222
219223 @ spec prepare_retrieve_opts (
220- opts :: opts ( ) ,
224+ client_context :: ClientContext . t ( ) ,
225+ session :: session ( ) ,
221226 scope :: String . t ( ) ,
222- nonce :: String . t ( ) | :any ,
223227 redirect_uri :: String . t ( ) ,
224- pkce_verifier :: String . t ( ) | :none
228+ opts :: opts ( )
225229 ) :: :oidcc_token . retrieve_opts ( )
226- defp prepare_retrieve_opts ( opts , scope , nonce , redirect_uri , pkce_verifier ) do
230+ defp prepare_retrieve_opts ( client_context , session , scope , redirect_uri , opts ) do
227231 scopes = :oidcc_scope . parse ( scope )
228232
229- refresh_jwks = Utils . get_refresh_jwks_fun ( opts )
230-
231233 opts
232234 |> Keyword . take ( [ :request_opts , :preferred_auth_methods ] )
233235 |> Map . new ( )
234236 |> Map . merge ( % {
235- nonce: nonce ,
237+ nonce: session . nonce ,
236238 scope: scopes ,
237239 redirect_uri: redirect_uri ,
238- pkce_verifier: pkce_verifier ,
239- refresh_jwks: refresh_jwks
240+ pkce_verifier: session . pkce_verifier
240241 } )
241- |> case do
242- % { pkce_verifier: :none } = opts -> Map . delete ( opts , :pkce_verifier )
243- opts -> opts
244- end
242+ |> Utils . put_refresh_jwks ( client_context , opts )
245243 end
246244
247- @ spec prepare_userinfo_opts ( opts :: opts ( ) ) :: :oidcc_userinfo . retrieve_opts ( )
248- defp prepare_userinfo_opts ( opts ) do
249- refresh_jwks = Utils . get_refresh_jwks_fun ( opts )
250-
251- % { refresh_jwks: refresh_jwks }
245+ @ spec prepare_userinfo_opts ( client_context :: ClientContext . t ( ) , opts :: opts ( ) ) ::
246+ :oidcc_userinfo . retrieve_opts ( )
247+ defp prepare_userinfo_opts ( client_context , opts ) do
248+ Utils . put_refresh_jwks ( % { } , client_context , opts )
252249 end
253250
254251 # The session is written by Oidcc.Plug.Authorize. Without it, there is nothing
255252 # to validate. Reject the request to prevent CSRF in that case.
256253 @ spec fetch_authorize_session ( conn :: Plug.Conn . t ( ) ) ::
257- { :ok , map ( ) } | { :error , error ( ) }
254+ { :ok , session ( ) } | { :error , error ( ) }
258255 defp fetch_authorize_session ( conn ) do
259256 case get_session ( conn , Authorize . get_session_name ( ) ) do
260257 % {
0 commit comments