неділя, 20 жовтня 2013 р.

Magento REST API і OAuth в Ruby

У цій статті я хочу поділитися прикладом роботи з Magento REST API використовуючи Ruby і oauth gem. У свій час пошуки подібного ні до чого не привели.

Докладна документація по Magento REST API тут.

Реєстрація та уповноваженому додатку


Отже, приступимо. Першим ділом, потрібно отримати всі потрібні параметри для авторизації. Зокрема ключі consumer_key і consumer_secret. І, власне хост(magentohost), на якому встановлене Magento.

Скажу відразу, налаштування платформи Magento для REST API не розглядається в рамках цієї статті.

require 'json'
require 'oauth'

auth = {
  consumer_key:    '***',
  consumer_secret: '***',
}

magentohost = 'http://example.com'

@consumer = OAuth::Consumer.new(auth[:consumer_key], auth[:consumer_secret], {
  :site               => magentohost,
  :request_token_path => '/oauth/initiate',
  :access_token_path  => '/oauth/token',
  :authorize_path     => '/admin/oauth_authorize',
})

Отримання токена


Для отримання access_token потрібно перейти за наступним посиланням, увійти(якщо потрібно) і уповноважити додаток.
Якщо автентифікація пройдена успішно, потрібно ввести отриманий код верифікації. Після цього будуть отримані token і token_secret, які використовуватимуться для здійснення HTTP запитів.

request_token = @consumer.get_request_token

puts request_token.authorize_url

print 'Код перевірки: '
verifier = gets.strip

access_token = request_token.get_access_token(:oauth_verifier => verifier)

auth[:token]        = access_token.token
auth[:token_secret] = access_token.secret

Запити до API


Ми вже отримали access_token і можемо виконувати HTTP запити.
response = access_token.request(:get, '/api/rest/products')
rsp = JSON.load(response.body)

Раніше отримані token і token_secret можна зберегти для того, щоб виконувати запити без попередньої автентифікації.
auth[:token]        = "***"
auth[:token_secret] = "***"

access_token = OAuth::AccessToken.new(@consumer, auth[:token], auth[:token_secret])

response = access_token.request(:get, '/api/rest/products')
rsp = JSON.load(response.body)

На цьому все.

Немає коментарів: