class Stackd::AuthRequest

Public Class Methods

client(client, params = {}) click to toggle source
# File lib/stackd/auth_request.rb, line 30
def client client, params = {}
  request_token client, grant_type: 'client_credentials',
                        scope: params[:scope]
end
new(client, attrs = {}) click to toggle source
# File lib/stackd/auth_request.rb, line 79
def initialize client, attrs = {}
  if client.nil?
    raise ArgumentError.new "client not provided"
  else
    self.client = client
  end

  attrs.each do |key, val|
    public_send :"#{key}=", val
  end

  if state.nil?
    self.state = SecureRandom.urlsafe_base64 9
  end
end
password(client, params) click to toggle source
# File lib/stackd/auth_request.rb, line 15
def password client, params
  if params[:username].nil?
    raise ArgumentError.new "username is required"
  end

  if params[:password].nil?
    raise ArgumentError.new "password is required"
  end

  request_token client, grant_type: 'password',
                        username: params[:username],
                        password: params[:password],
                        scope: params[:scope]
end
refresh(client, token, params = {}) click to toggle source
# File lib/stackd/auth_request.rb, line 35
def refresh client, token, params = {}
  if token.nil?
    raise ArgumentError.new "Token is required"
  end

  if token.refresh_token.nil?
    raise ArgumentError.new "Token must have refresh_token"
  end

  request_token client, grant_type: 'refresh_token',
                        refresh_token: token.refresh_token,
                        scope: params[:scope]
end

Private Class Methods

request_token(client, params = {}) click to toggle source
# File lib/stackd/auth_request.rb, line 51
def request_token client, params = {}
  if params[:grant_type].nil?
    raise ArgumentError.new "grant_type not provided"
  end

  res = Unirest.post "#{Stackd.config.api_url}/token", {
    auth: {
      user: client.id,
      password: client.secret
    },
    headers: {'Content-Type' => 'application/x-www-form-urlencoded'},
    parameters: params.reject { |k,v| v.nil? }
  }

  if res.code == 200
    token = client.tokens.new res.body.symbolize_keys

    on_grant_callbacks = \
      Stackd::Token.instance_variable_get :@_on_grant_callbacks
    on_grant_callbacks.each {|c| c.(token) }

    token
  else
    raise Error.new res.body.symbolize_keys
  end
end

Public Instance Methods

callback(params) click to toggle source
# File lib/stackd/auth_request.rb, line 109
def callback params
  unless params[:code] || params[:error]
    raise ArgumentError.new 'no code or error'
  end

  if params[:state] != state
    raise StateMismatchError.new "#{params[:state]} != #{state}"
  end

  if params[:error]
    raise Error.new params
  else
    self.class.send :request_token, client, {
      grant_type: 'authorization_code',
      code: params[:code],
      redirect_uri: redirect_uri
    }
  end
end
url(params = {}) click to toggle source
# File lib/stackd/auth_request.rb, line 95
def url params = {}
  uri = auth_url

  uri.query_values = {
    response_type: 'code',
    client_id: client.id,
    state: state,
    redirect_uri: params[:redirect_uri],
    scope: params[:scope]
  }.reject { |k,v| v.nil? }

  uri.to_s
end

Private Instance Methods

auth_url() click to toggle source
# File lib/stackd/auth_request.rb, line 131
def auth_url
  Addressable::URI.parse Stackd.config.auth_url
end