class PlugAir

PlugAir Class

vim:fileencoding=utf-8

Constants

API_KEY_LENGTH
API_KEY_PARAMETER
AUTH_RESULT_NG
AUTH_RESULT_OK
AUTH_RESULT_OTHER_APP_PLUG
BASE_RESOURCE_PATH
HOST_NAME

Constants

PATH_CHALLENGE
PATH_VERIFY
SHARED_SECRET_LENGTH
VERSION
X_PLUGAIR_TOKEN_HEADER

Public Class Methods

new(api_key=ENV['PLUGAIR_API_KEY'], shared_secret=ENV['PLUGAIR_SHARED_SECRET']) click to toggle source
# File lib/plugair_sdk.rb, line 49
def initialize(api_key=ENV['PLUGAIR_API_KEY'], shared_secret=ENV['PLUGAIR_SHARED_SECRET'])
  validate_api_key_and_shared_secret(api_key, shared_secret)

  @api_key = api_key
  @shared_secret = shared_secret
end

Public Instance Methods

generate_challenge() click to toggle source
# File lib/plugair_sdk.rb, line 57
def generate_challenge
  validate_api_key_and_shared_secret(@api_key, @shared_secret)

  resource_path = BASE_RESOURCE_PATH + PATH_CHALLENGE
  query_params  = API_KEY_PARAMETER + @api_key
  request_body  = JSON.generate({})

  uri = URI.parse(HOST_NAME + resource_path + '?' + query_params)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  req = Net::HTTP::Get.new(uri.request_uri)
  https.open_timeout = 10
  https.read_timeout = 20
  req['Content-Type'] = 'application/json'
  req['X-PlugAir-Token'] = generate_x_plugair_token(resource_path, query_params, request_body)
  res = https.request(req)

  case res
  when Net::HTTPSuccess
    json = JSON.parse(res.body)
    return json['challenge']
  else
    json = JSON.parse(res.body)
    if json['status'] and json['reason'] and json['message'] then
      raise PlugAirAuthError.new(json['status'], json['reason'], json['message'])
    else
      raise PlugAirUnknownError.new
    end
  end
end
verify(credential_key, auth_key, auth_data) click to toggle source
# File lib/plugair_sdk.rb, line 89
def verify(credential_key, auth_key, auth_data)
  validate_api_key_and_shared_secret(@api_key, @shared_secret)

  resource_path = BASE_RESOURCE_PATH + PATH_VERIFY
  query_params  = API_KEY_PARAMETER + @api_key
  request_body  = JSON.generate({
    :credentialKey => credential_key,
    :authKey => auth_key,
    :authData => auth_data
  })

  uri = URI.parse(HOST_NAME + resource_path + '?' + query_params)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true
  req = Net::HTTP::Post.new(uri.request_uri)
  req.body = request_body
  https.open_timeout = 10
  https.read_timeout = 20
  req['Content-Type'] = 'application/json'
  req['X-PlugAir-Token'] = generate_x_plugair_token(resource_path, query_params, request_body)
  res = https.request(req)

  case res
  when Net::HTTPSuccess
    json = JSON.parse(res.body)
    return json
  else
    json = JSON.parse(res.body)
    if json['status'] and json['reason'] and json['message'] then
      raise PlugAirAuthError.new(json['status'], json['reason'], json['message'])
    else
      raise PlugAirUnknownError.new
    end
  end
end

Private Instance Methods

generate_x_plugair_token(resource_path, query_params, request_body) click to toggle source
# File lib/plugair_sdk.rb, line 148
def generate_x_plugair_token(resource_path, query_params, request_body)
  require 'openssl'
  timestamp = Time.now.getutc.to_i.to_s
  hash_in = timestamp + resource_path + query_params + request_body
  hash_out = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), @shared_secret, hash_in).upcase
  return X_PLUGAIR_TOKEN_HEADER + ':' + timestamp + ':' + hash_out
end
validate_api_key_and_shared_secret(api_key, shared_secret) click to toggle source
# File lib/plugair_sdk.rb, line 128
def validate_api_key_and_shared_secret(api_key, shared_secret)
  if api_key then 
    if not api_key.is_a?(String) or api_key.length != API_KEY_LENGTH then
      raise PlugAirApiKeyError.new('API key length is invalid.')
    end
  else
    raise PlugAirApiKeyError.new('API key not found.')
  end
    
  if shared_secret then 
    if not shared_secret.is_a?(String) or shared_secret.length != SHARED_SECRET_LENGTH then
      raise PlugAirApiKeyError.new('Shared secret length is invalid.')
    end
  else
    raise PlugAirApiKeyError.new('Shared secret not found.')
  end

  return true
end