Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prepend sign_up page with a condition?

I want to ask user a question, and let him sign up only if the user answers my question correctly. I searched devise how-to acticles but my case doesn't seem to be there.

Is there an idiomatic way to deal with this situation?

The first thought might be to use javascript, but answers are stored in LDAP, and I expect it will be easier to deal with this in rails.

I was also thinking about disabling /users/sign_up route, invoke the action (devise/registration#new) manually and render the view (devise/registration/new).

Another way I can think of, is to run a background daemon, which will collect session id, where user answered the questions correctly. On correct answer user will be redirected to the publicly available sign up page, which will get check user's session id with the daemon.

like image 364
Adobe Avatar asked Dec 25 '15 15:12

Adobe


1 Answers

Assuming you have cookie data signed (as is the default in Rails 3), you could do as you say and use the session:

# app/controllers/preauth_controller.rb
def new
end

def create
  if params[:answer] == 'correct answer'
    session[:preauthorized] = true
    redirect_to sign_up_path
  end
  flash[:error] = 'Incorrect answer'
  render :new
end


# app/controllers/users_controller.rb
before_filter :verify_preauth, only: [:new, :create]

def verify_preauth
  redirect_to new_preauth_path unless session[:preauthorized]
end

If cookie data is not signed, however, the preauthorized key can be tampered with by the client and thus should not be trusted.

Provided that your page is encrypted in transit with HTTPS via TLS and you don't have any XSS vulnerabilities present, this should be sufficiently secure for your needs. If you feel this is a particularly sensitive piece of code, you would want more than the passing thoughts of a StackOverflow user to guide and implement a comprehensive approach to securing your application.

like image 51
coreyward Avatar answered Oct 05 '22 23:10

coreyward