@@ -40,6 +40,7 @@ def self.inherited(subclass)
4040 } ,
4141 :code_challenge_method => "S256" ,
4242 }
43+ option :state_container , StateContainer . new
4344
4445 attr_accessor :access_token
4546
@@ -60,7 +61,7 @@ def request_phase
6061 end
6162
6263 def authorize_params # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
63- options . authorize_params [ :state ] = SecureRandom . hex ( 24 )
64+ options . authorize_params [ :state ] = new_state
6465
6566 if OmniAuth . config . test_mode
6667 @env ||= { }
@@ -72,7 +73,7 @@ def authorize_params # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
7273 . merge ( pkce_authorize_params )
7374
7475 session [ "omniauth.pkce.verifier" ] = options . pkce_verifier if options . pkce
75- session [ "omniauth.state" ] = params [ :state ]
76+ options . state_container . store ( self , params [ :state ] )
7677
7778 params
7879 end
@@ -83,7 +84,7 @@ def token_params
8384
8485 def callback_phase # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
8586 error = request . params [ "error_reason" ] || request . params [ "error" ]
86- if !options . provider_ignores_state && ( request . params [ "state" ] . to_s . empty? || request . params [ "state" ] != session . delete ( "omniauth.state" ) )
87+ if !options . provider_ignores_state && ( request . params [ "state" ] . to_s . empty? || request . params [ "state" ] != options . state_container . take ( self ) )
8788 fail! ( :csrf_detected , CallbackError . new ( :csrf_detected , "CSRF detected" ) )
8889 elsif error
8990 fail! ( error , CallbackError . new ( request . params [ "error" ] , request . params [ "error_description" ] || request . params [ "error_reason" ] , request . params [ "error_uri" ] ) )
@@ -100,6 +101,10 @@ def callback_phase # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexi
100101 fail! ( :failed_to_connect , e )
101102 end
102103
104+ def new_state
105+ SecureRandom . hex ( 24 )
106+ end
107+
103108 protected
104109
105110 def pkce_authorize_params
0 commit comments