Не мога да получа токен за постоянен достъп за моето приложение Shopify

Следвам инструкциите на Shopify, за да получа постоянен токен за конкретна комбинация приложение/магазин (http://api.shopify.com/authentication.html).

Мога да получа временния токен и след това да използвам прост html формуляр, за да получа постоянен токен:

Но отговорът, който получавам, е: {"error":"invalid_request"}

Можете ли да ми помогнете, моля? Търсих навсякъде (Stackoverflow, форуми за поддръжка на Shopify и т.н...), но не мога да намеря представа как да реша това. Моето приложение е онлайн и се хоства на Heroku.

Благодаря,

изображение 3изображение 2 изображение 1


person Augusto    schedule 30.06.2012    source източник
comment
Можете ли да публикувате необработената заявка и отговор? API ключът, който използвате, също би помогнал.   -  person John Duff    schedule 30.06.2012
comment
Добавих няколко изображения, показващи пълния отговор, който получавам. Има и API ключ (клиентски идентификатор). Благодаря за проявения интерес!   -  person Augusto    schedule 30.06.2012


Отговори (2)


Мисля, че имаме подобни умове! Изпитвах точно същия проблем като теб. Мисля, че и двамата бяхме объркани от документацията!

Генерирах приложението си с помощта на shopify_app gem. Това създаде следния метод в login_controller.rb:

def finalize
  if response = request.env['omniauth.auth']
    sess = ShopifyAPI::Session.new(params['shop'], response['credentials']['token'])
    session[:shopify] = sess        
    flash[:notice] = "Logged in"
    redirect_to return_address
    session[:return_to] = nil
  else
    flash[:error] = "Could not log in to Shopify store."
    redirect_to :action => 'index'
  end
end

Ред 3 от това (ShopifyAPI::Session.new) извършва Стъпка 2 от удостоверяването на Shopify вместо нас. Извлича ни токен за постоянен достъп.

Променливата sess сега ще съдържа две неща:

  1. Домейнът *.myshopify.com на магазина (url)
  2. Токен за постоянен достъп за запазване за бъдеща употреба (token)

Както каза Джон Дъф - вече имаме токен за достъп! Не е необходимо да ПУБЛИКУВАМЕ до https://SHOP_NAME.myshopify.com/admin/oauth/access_token. Това се обработва за нас в кода, генериран от shopify_app gem.

В моя метод за финализиране добавих ред:

def finalize
  if response = request.env['omniauth.auth']
    sess = ShopifyAPI::Session.new(params['shop'], response['credentials']['token'])

    Shop.find_or_create_by_myshopify_domain(sess.url, access_token: sess.token)
  ...

Това създава магазин и му присвоява токена за достъп. Моделът My Shop има атрибути myshopify_domain и access_token.

В бъдеще, ако искам да използвам ShopifyAPI за този магазин, мога просто да следвам инструкциите на началната страница на shopify_api gem

Прекарах часове в опити да разгадая това. Не съм сигурен как документацията може да бъде по-ясна. Надяваме се, че ако проблемът се появи отново, хората ще намерят тази страница на StackOverflow!

Надявам се, че това е било от помощ за вас.

Наздраве, Ник

person Nick Malcolm    schedule 07.07.2012
comment
Благодаря ти, Ник, току-що се върнах в офиса след няколко дни почивка и намерих страхотния ти отговор. Благодаря ви много, вашето решение работи прекрасно. Не мога да разбера защо shopify gem не казва това ясно! - person Augusto; 10.07.2012
comment
бам Ако можех да гласувам повече от веднъж, щях да го направя. Може би ще пусна скъпоценен камък за добавка „shopify_app“, който лесно предоставя опцията за съхраняване на постоянни токени. - person Chuck Bergeron; 21.08.2012
comment
При моето тестване токенът, върнат в env['omniauth.auth']['credentials']['token'], е същият като обменения токен. Не е ли така и при другите? - person Arrel; 03.02.2015

След като кодът бъде използван, след като изтече, трябва да съхраните токена или да поискате нов код. В регистрационните файлове една от вашите заявки е успешна, след което сте продължили да правите заявки за токени за достъп със същия код, който е неуспешен, защото кодът е изтекъл.

Опитайте отново да поискате разрешение и да направите извикване на токена за достъп с новия код, който получавате. Уверете се, че сте съхранили токена за достъп, защото кодът не може да се използва отново.

person John Duff    schedule 02.07.2012
comment
Благодаря Джон, прав си, но така и не успях да получа валиден код за достъп. Опитах с 3 различни токена, но дори когато токенът е нов и не е използван никога преди, получавам същия отговор: {error:invalid_request} :( - person Augusto; 02.07.2012
comment
Това не е това, което виждам от регистрационните файлове на заявките, мисля, че може да има нещо с каквато и библиотека да използвате. Пробвал ли си с cURL от командния ред? - person John Duff; 02.07.2012
comment
Благодаря, Джон, опитах да поискам нов код и след това опитах отново да получа нов код за достъп с тази команда от командния ред cURL: curl -d client_id=xxx&client_secret=xxx&code=xxx discoverstore.myshopify.com/admin/oauth/access_token - person Augusto; 03.07.2012
comment
Това, което виждам, е на 3 юли в 5:19 UTC заявка за маркер за достъп с предадени параметри grant_type и redirect_uri и потребителски агент Ruby, който успява. След това виждам редица заявки за токени за достъп, използващи същия код, който вече е бил използван, включително заявката cURL. Каквото и да правите първоначално, което използвате, за да вземете кода, извършва пълния обмен, след което по някаква причина се опитвате да използвате кода отново, за да го обмените за друг маркер за достъп. - person John Duff; 04.07.2012
comment
Използвате ли някаква библиотека, която обработва част от това вместо вас? - person John Duff; 04.07.2012