Rails omniauth-shopify-oauth2: [API] Недействительный ключ API или токен доступа (неопознанный логин или неправильный пароль) из консоли

Я установил shopify auth (omniauth-shopify-oauth2 gem) для своего приложения rails 3.2.6.

Он отлично работает при перенаправлении с веб-страницы (на следующее действие контроллера #)

class ShopifyController < ApplicationController
  ...
  def login
    redirect_to "/auth/shopify?shop=#{current_retailer.primary_host_name}"
  end

Он перенаправляет меня на вход в магазин и, как только я вхожу в систему, перенаправляет обратно к успешному обратному вызову. Все в порядке (см. УСПЕХ ЖУРНАЛА СЕРВЕРА ниже).

Но когда я пытаюсь сделать то же самое с консоли rails:

irb(main):001:0> RestClient.get 'http://localhost:3000/auth/shopify?shop=vinehillposters.myshopify.com'

Я получил:

RestClient::Unauthorized: 401 Unauthorized: <?xml version="1.0" encoding="UTF-8"?>
<hash>
  <errors>[API] Invalid API key or access token (unrecognized login or wrong password)</errors>
</hash>

см. СБОЙ ЖУРНАЛА СЕРВЕРА ниже


УСПЕХ В ЖУРНАЛЕ СЕРВЕРА

Processing by ShopifyController#login as HTML
... AR stuff snipped ...
Redirected to http://localhost:3000/auth/shopify?shop=vinehillposters.myshopify.com
Completed 302 Found in 93ms (ActiveRecord: 1.6ms)
(shopify) Setup endpoint detected, running now.
(shopify) Request phase initiated.
"https://vinehillposters.myshopify.com/admin/oauth/authorize?response_type=code&client_id=44dd9799fbc268c36ef609f0c2386b8c&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fshopify%2Fcallba
ck&scope=read_orders"

Started GET "/auth/shopify?shop=vinehillposters.myshopify.com" for 127.0.0.1 at 2012-10-30 11:24:21 +0000
(shopify) Setup endpoint detected, running now.
(shopify) Callback phase initiated.

Started GET "/auth/shopify/callback?code=c8c6696ed347e37324d2d62ec203457b&shop=vinehillposters.myshopify.com&timestamp=1351596261&signature=e6324b041d6a6ed1e07719a8909d70f7" for 127.0.0.1 at 
2012-10-30 11:24:21 +0000
Processing by ShopifyController#auth_callback as HTML
...


СБОЙ ЖУРНАЛА СЕРВЕРА:

(shopify) Setup endpoint detected, running now.
(shopify) Request phase initiated.
"https://vinehillposters.myshopify.com/admin/oauth/authorize?response_type=code&client_id=44dd9799fbc268c36ef609f0c2386b8c&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fauth%2Fshopify%2Fcallback&scope=read_orders"


Started GET "/auth/shopify?shop=vinehillposters.myshopify.com" for 127.0.0.1 at 2012-10-30 11:24:54 +0000

Возможно, вы заметили, что я распечатываю url-адрес request_phase прямо перед тем, как он будет перенаправлен на shopify (после (shopify) Request phase initiated.). В обоих случаях это одно и то же. За исключением одного случая, он возвращает успех, а в другом - 401.

Итак, что я делаю не так?


person artemave    schedule 30.10.2012    source источник
comment
Что еще может делать браузер, чего нет в RestClient? Может быть, это связано с файлами cookie?   -  person csaunders    schedule 30.10.2012
comment
Несомненно. Но я должен обойтись без этого. github.com/Shopify/shopify_api   -  person artemave    schedule 30.10.2012
comment
Особенно, если мне нужно запустить shopify auth из фонового задания или чего-то еще   -  person artemave    schedule 30.10.2012
comment
Вы получаете токен от обратного вызова в переменной среды omniauth.auth. Сохраните токен в базе данных для этого магазина или чего-то еще, а затем используйте его для подготовки аутентифицированного сеанса с Shopify.   -  person csaunders    schedule 30.10.2012
comment
@csaunders только что понял это! Я смешивал установку (то, что вы делаете однажды) с аутентификацией (то, что вы делаете, когда используете API)   -  person artemave    schedule 30.10.2012


Ответы (1)


Я думаю, что ваш вопрос сбивает с толку, и вы фокусируетесь не на том. Что вам нужно сделать, так это после того, как ваш пользователь вошел в систему, получить некоторую информацию о нем из обратного вызова shopify.

def shopify
  shopify_domain = params[:shop]
  @your_shop_object = your_finds_or_initializes_shop_or_auth_object_with shopify_domain, token

  if @your_shop_object.persisted?
    redirect_to root_url
  else
    # something went wrong :/
    session['devise.shopify_data'] = request.env['omniauth.auth']
    redirect_to auth_index_url
  end
end

private
def token
  request.env['omniauth.auth']['credentials']['token']
end

Теперь с этим вы можете использовать сохраненные данные об объектах магазина для настройки авторизованного сеанса.

session = ShopifyAPI::Session.new(domain, authentication_token)
if session.valid?
  ShopifyAPI::Base.activate_session(session)
  # Now you can make api calls for that shop (domain)
else
  Rails.logger.error "[Shop] Could not create a valid session for '#{domain}'"
end
person csaunders    schedule 30.10.2012
comment
Да, мой вопрос сбивает с толку. Это потому, что я не понимал, что токен аутентификации предназначен для УСТАНОВКИ, а не для какого-то короткого сеанса. - person artemave; 30.10.2012
comment
Помогло ли это вам решить вашу проблему? - person csaunders; 30.10.2012
comment
«Это» как в «ваш ответ»? Не совсем. Хотя теперь это имеет смысл. - person artemave; 31.10.2012