Sha256: d2fe8378f6da2bfaf5318ffed1dcec476672af898b3c04ed2dd2bbf40e01dd0e

Contents?: true

Size: 1.95 KB

Versions: 1

Compression:

Stored size: 1.95 KB

Contents

Warden::Strategies.add(:oauthed) do
  # Need to make sure that we have a pure representation of the query string.
  # Rails adds an "action" parameter which causes the openid gem to error
  def params
    @params ||= Rack::Utils.parse_query(request.query_string)
  end

  def api_url
    ENV['API_BASE_URL'] || '/api/v1'
  end

  def authenticate!
    if params['code']
      begin
        get_user_api_response(params)
      rescue OAuth2::Error
        %(<p>Outdated ?code=#{params['code']}:</p><p>#{$ERROR_INFO}</p>
          <p><a href="/auth/oauthed">Retry</a></p>)
      end
    else
      env['rack.session']['return_to'] = env['REQUEST_URI']
      throw(:warden, [302, { 'Location' => authorize_url }, []])
    end
  end

  private

  def get_user_api_response(params)
    api = api_for(params['code'])
    resp = api.get "#{api_url}/me" do |request|
      request.params['access_token'] = api.token
    end.body

    user = MultiJson.load(resp)
    success!(Warden::Oauthed::Oauth::User.new(user['user'], api.token))
  end

  def oauth_client
    oauth_proxy.client
  end

  def authorize_url
    oauth_proxy.authorize_url
  end

  def api_for(code)
    oauth_proxy.api_for(code)
  end

  def oauth_proxy
    @oauth_proxy ||= Warden::Oauthed::Oauth::Proxy.new(
      env['warden'].config[:oauthed_client_id],
      env['warden'].config[:oauthed_secret],
      env['warden'].config[:oauthed_scopes],
      env['warden'].config[:oauthed_oauth_domain],
      callback_url
    )
  end

  def callback_url
    absolute_url(
      request,
      env['warden'].config[:oauthed_callback_url],
      env['HTTP_X_FORWARDED_PROTO']
    )
  end

  def absolute_url(request, suffix = nil, proto = 'http')
    port_part =
      case request.scheme
      when 'http'
        request.port == 80 ? '' : ":#{request.port}"
      when 'https'
        request.port == 443 ? '' : ":#{request.port}"
      end
    proto = 'http' if proto.nil?
    "#{proto}://#{request.host}#{port_part}#{suffix}"
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
warden-oauthed-0.0.4 lib/warden-oauthed/strategy.rb