class Mdm::Enrollment::Auth

Public Class Methods

token() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 20
def token
  @@token ||= new.obtain_token
end
update_token_from_response(response) click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 24
def update_token_from_response(response)
  if response && token = response.headers['x-adm-auth-session']
    @@token = token
  end
end

Public Instance Methods

obtain_token() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 32
def obtain_token
  client.get '/session',
         headers: {
           'Authorization' => authorization_header
         }
  client.response['auth_session_token']
end
params() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 40
def params
  @params ||= {
    oauth_consumer_key: consumer_key,
    oauth_token: access_token,
    oauth_nonce: nonce,
    oauth_timestamp: Time.now.getutc.to_i.to_s,
    oauth_version: '1.0',
    oauth_signature_method: 'HMAC-SHA1'
  }
end

Private Instance Methods

authorization_header() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 53
def authorization_header
  params_with_signature = params.merge(
    realm: 'MDM',
    oauth_signature: sign(base_str)
  )

  'OAuth ' + params_with_signature.map { |key, value|
    "#{key}=\"#{value}\""
  }.join(', ')
end
base_str() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 64
def base_str
  # Encode, sort and join params
  params_encoded = params.inject({}) { |hash, (key, value)|
    hash[CGI::escape(key.to_s)] = CGI::escape(value)
    hash
  }.sort.map { |key, value|
    "#{key}=#{value}"
  }.join('&')

  # Request method + url with path + params, escaped and joined by &
  [
    'GET',
    "https://mdmenrollment.apple.com/session",
    params_encoded
  ].map { |str|
    CGI::escape(str)
  }.join('&')
end
nonce() click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 90
def nonce
  @nonce ||= Base64.encode64(
    OpenSSL::Random.random_bytes(7)
  ).gsub(/\W/, '')
end
sign(base_str) click to toggle source
# File lib/mdm/enrollment/service/auth.rb, line 83
def sign(base_str)
  key = "#{CGI::escape(consumer_secret)}&#{CGI::escape(access_secret)}"
  digest = OpenSSL::Digest.new('sha1')
  hmac = OpenSSL::HMAC.digest(digest, key, base_str)
  CGI::escape(Base64.encode64(hmac).chomp.gsub(/\n/, ''))
end