class SimpleGoogleAuth::Receiver

Public Instance Methods

call(env) click to toggle source
# File lib/simple_google_auth/receiver.rb, line 3
def call(env)
  request = Rack::Request.new(env)
  config = SimpleGoogleAuth.config
  ensure_params_are_correct(request, config)

  api = SimpleGoogleAuth::OAuth.new(config)
  auth_data = api.exchange_code_for_auth_token!(request.params["code"])

  data = AuthDataPresenter.new(auth_data)
  raise Error, "Authentication failed" unless config.authenticate.call(data)

  request.session[config.data_session_key_name] = auth_data

  path = config.authentication_uri_state_path_extractor.call(request.session[config.state_session_key_name])
  path = "/" if path.blank?
  [302, {"Location" => path}, [" "]]

rescue Error => e
  uri = URI(config.failed_login_path)
  uri.query = uri.query ? "#{uri.query}&" : ""
  uri.query += "message=#{CGI.escape e.message}"
  [302, {"Location" => uri.to_s}, [" "]]
end

Protected Instance Methods

ensure_params_are_correct(request, config) click to toggle source
# File lib/simple_google_auth/receiver.rb, line 28
def ensure_params_are_correct(request, config)
  if request.params["state"] != request.session[config.state_session_key_name]
    raise Error, "Invalid state returned from Google"
  elsif request.params["error"]
    raise Error, "Authentication failed: #{request.params["error"]}"
  elsif request.params["code"].nil?
    raise Error, "No authentication code returned"
  end
end