{"record":{"id":"68b102c127385032","repo":"discourse/discourse","slug":"second-factor-auth-challenge-not-completed","errorCode":null,"errorMessage":"second_factor_auth.challenge_not_completed","messagePattern":"second_factor_auth\\.challenge_not_completed","errorType":"exception","errorClass":"SecondFactor::BadChallenge","httpStatus":401,"severity":"error","filePath":"lib/second_factor/auth_manager.rb","lineNumber":219,"sourceCode":"      allowed_methods: allowed_methods.to_a,\n      generated_at: Time.zone.now.to_i,\n      target_user_id: @target_user.id,\n    }\n    challenge[:description] = config[:description] if config[:description]\n    challenge[:redirect_url] = config[:redirect_url] if config[:redirect_url].present?\n    server_session[\"current_second_factor_auth_challenge\"] = challenge.to_json\n    nonce\n  end\n\n  def verify_second_factor_auth_completed(nonce, server_session)\n    challenge =\n      self.class.find_second_factor_challenge(\n        nonce: nonce,\n        server_session:,\n        target_user: @target_user,\n      )\n    if !challenge[:successful]\n      raise SecondFactor::BadChallenge.new(\n              \"second_factor_auth.challenge_not_completed\",\n              status_code: 401,\n            )\n    end\n\n    server_session.delete(\"current_second_factor_auth_challenge\")\n    callback_params = challenge[:callback_params]\n    data = @action.second_factor_auth_completed!(callback_params)\n    data\n  end\n\n  def add_method(id)\n    if !@allowed_methods.include?(id)\n      @allowed_methods = Set.new(@allowed_methods)\n      @allowed_methods.add(id)\n      @allowed_methods.freeze\n    end\n  end","sourceCodeStart":201,"sourceCodeEnd":237,"githubUrl":"https://github.com/discourse/discourse/blob/1b2d7253e854205d2c95c80b2c6a1cdd42e45059/lib/second_factor/auth_manager.rb#L201-L237","documentation":"Error \"second_factor_auth.challenge_not_completed\" thrown in discourse/discourse.","triggerScenarios":"Thrown at lib/second_factor/auth_manager.rb:219 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"1b2d7253e854205d2c95c80b2c6a1cdd42e45059","analyzedAt":"2026-08-26T03:11:08.302Z","schemaVersion":2},"datasetVersion":"2026-08-26T07:17:17.940Z"}