簡體   English   中英

如何繞過帶有 RSPEC 的 Rails controller 中的驗證碼?

[英]How do I bypass recaptcha verification in rails controller w/ RSPEC?

在我的 rails UsersController - users#sign_up操作中,我執行驗證以確保用戶擁有有效的 recaptcha v3 令牌,然后再轉到 controller 邏輯的 rest。 如果 recaptcha 驗證失敗,則 controller 返回並以錯誤消息響應。 但是,我的rspec測試失敗了,因為我不確定如何模擬/繞過 controller 中的驗證。

spec/requests/auth_spec.rb:

RSpec.describe "Authentication Requests", type: :request do
  context "sign up user" do
    it "fails to sign up a user without email address" do
      headers = { :CONTENT_TYPE => "application/json" }
      post "/api/v1/sign_up", :params => { :email => nil, :password => "password123"}.to_json, :headers => headers
      expect(response.header['Content-Type']).to include('application/json')
      expect(response_body_to_json).to eq({"error"=>"Failed to create user"})
    end
  end
end

當我發布到/api/v1/sign_up時測試失敗,因為 recaptcha 令牌缺少參數。 據我了解,無法模擬 recaptcha v3 令牌。 因此,對於 rspec 測試,最好讓verify_recaptcha返回true

controllers/api/v1/users_controller:

def sign_up
  # Rspec fails here with missing params error
  return if !verify_recaptcha('sign_up', recaptcha_params[:token])

  @user = User.new(user_credential_params)

  if @user.valid?
    # Handle success/fail logic
  end
end

private

def user_credential_params
  params.permit(:email, :password)
end

def recaptcha_params
  params.permit(:token)
end

controllers/concerns/users_helper.rb:

def verify_recaptcha(recaptcha_action, token)
  secret_key = Rails.application.credentials.RECAPTCHA[:SECRET_KEY]

  uri = URI.parse("https://www.google.com/recaptcha/api/siteverify?secret=#{secret_key}&response=#{token}")
  response = Net::HTTP.get_response(uri)

  json = JSON.parse(response.body)

  recaptcha_valid = json['success'] && json['score'] > 0.5 && json['action'] == recaptcha_action

  if !recaptcha_valid
    render :json => { :error_msg => 'Authentication Failure' }, :status => :unauthorized
    return false
  end

  return true
end

我可以存根/模擬來自users_helper關注的verify_recaptcha方法以返回true嗎? 有沒有更好的方法來實現這一點?

在問這個問題之前我做了盡職調查,我發現了這篇文章: mocking/stubbing a controller recaptcha method with rspec in rails

這是該帖子的答案:

allow(controller).to receive(:verify_recaptcha).and_return(true)

以上對我不起作用,因為個人在ApplicationController.rb中有他們的verify_recaptcha方法(在我看來這似乎有點臟)。 鑒於我的verify_recaptcha方法屬於關注點,我不確定如何通過 Rspec 訪問關注點。

您可以嘗試將UserController.expects(:verify_recaptcha).returns(true)添加到您的測試中。 這將繞過 recaptcha 或只是嘗試查找 verify_recaptcha 方法存在的位置,然后在UserController.expects(:verify_recaptcha).returns(true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM