API Yahoo с Ruby on Rails и OAUTH2

У меня есть сайт RoR, который получает данные с фондовых бирж, и я использую финансовую таблицу Yahoo через API Yahoo. Мне нужна авторизация, чтобы получить полный доступ к YQL, что требует использования Oauth2. Мне нужна помощь в получении доступа OAuth к Yahoo.

Это то, что я пробовал:

client = OAuth2::Client.new(oauth_consumer_key,oauth_consumer_secret, {
        access_token_path:   '/oauth/v2/get_token',
        authorize_path:      '/oauth/v2/request_auth',
        authorize_url:       'https://api.login.yahoo.com/oauth/v2/request_auth',
        request_token_path:  '/oauth/v2/get_request_token',
        site:                'https://api.login.yahoo.com'
    })
puts client.auth_code.authorize_url( redirect_uri: "http://localhost:3000")
code = gets.chomp
token = client.auth_code.get_token(code, redirect_uri: "http://localhost:3000")

Я не знаю, какой «код» я должен использовать. Authorize_url returns me this URL, but it непонятно что за "код". Меня вдохновил этот вопрос.


person quatermain    schedule 04.12.2012    source источник
comment
OAuth работает в два этапа: 1) вы делаете вызов, подобный приведенному выше, передавая свой ключ и секрет, что должно привести вас в место, где вы можете 2) получить токен авторизации. Маркер авторизации затем используется в последующих запросах контента. Пример, который вы указали и использовали, делает некоторые предположения. Я уверен, что есть хорошие примеры того, как использовать OAuth с API Yahoo — хотя протокол один и тот же, есть несколько разных подходов — вам нужно понять, какой из них использует Yahoo.   -  person Tom Harrison    schedule 04.12.2012
comment
Кроме того, вы не указываете, используете ли вы драгоценный камень, и если да, то какой.   -  person Tom Harrison    schedule 04.12.2012
comment
Я использую гем oauth2. Я попробовал это руководство: developer.yahoo.com/oauth/guide/oauth-requesttoken .html, но я не понимаю oauth_signature, поэтому Google говорит, что OAUTH — лучшее решение.   -  person quatermain    schedule 04.12.2012
comment
Посмотрите здесь несколько примеров использования OAuth из ruby: developer.yahoo.com/ruby/#oauth   -  person Tom Harrison    schedule 04.12.2012
comment
спасибо, но мне это не подходит, gist.github.com/383159 это без драгоценного камня OAUTH2 .   -  person quatermain    schedule 04.12.2012
comment
Я думаю, что это зависит от вас отсюда, тогда. На странице, на которую я ссылаюсь, есть несколько хороших примеров, и Google должен предоставить еще больше.   -  person Tom Harrison    schedule 04.12.2012
comment
Спасибо, но вы думаете, что у меня проблемы с кодом или я должен получить код Yahoo, чтобы разрешить API (d.pr /i/qj3i)?   -  person quatermain    schedule 04.12.2012
comment
Итак... разве код, возвращаемый gets.chomp, не тот, который вам нужно ввести в форму?   -  person Tom Harrison    schedule 04.12.2012
comment
gets.chomp читает с клавиатуры, поэтому у меня должен быть код, но у меня его нет.   -  person quatermain    schedule 04.12.2012
comment
Я основывался на коде сути, который quatermain предоставил выше, и создал подробное описание здесь (мне потребовалось 5 дней, чтобы пройти аутентификацию в Yahoo и сделать успешный вызов API Yahoo): docs.google.com/document/d/   -  person datnt    schedule 09.11.2013
comment
@datnt добавьте это как ответ, пожалуйста.   -  person quatermain    schedule 11.11.2013


Ответы (2)


Не спрашивайте меня, почему, но Yahoo очень усложнила поиск документации по OAuth 2.0. Но я нашел!

Кроме того, довольно «круто», что вы получаете refresh_token без необходимости явно запрашивать у пользователя «автономные» разрешения. На мой взгляд, это проблема безопасности Yahoo. И Google, и Microsoft требуют явного «автономного» доступа.

require 'oauth2'

OAuth2::Client.new(Rails.application.secrets.yahoo_consumer_id, Rails.application.secrets.yahoo_consumer_secret, site: 'https://api.login.yahoo.com', authorize_url: '/oauth2/request_auth', token_url: '/oauth2/get_token')
client.auth_code.authorize_url(redirect_uri: redirect_uri, headers: { "Authorization" => basic_authorization })
token = client.auth_code.get_token(code, redirect_uri: redirect_uri)

# Later
token.refresh!
person maletor    schedule 11.09.2014
comment
Вы также должны найти мой запрос на включение, чтобы исправить необходимость в заголовках авторизации в геме OAuth2. API. - person maletor; 13.09.2014
comment
эта линия работала? токен = client.auth_code.get_token (код, redirect_uri: redirect_uri). мой выдает ошибку. - person ben; 16.01.2015
comment
Большое спасибо за ответ, так что причина, по которой я хотел получить токен, заключается в том, что я хотел получить доступ к своим контактам Yahoo. - person ben; 17.01.2015
comment
PR @maletor #192 для устранения необходимости в заголовках авторизации был переделан и объединен в github .com/oauth-xx/oauth2/pull/280. Это было частью последних двух релизов. Скоро выйдет еще один новый релиз драгоценного камня. - person Peter H. Boling; 07.03.2018

По запросу quatermain я размещаю свое решение в качестве ответа здесь:

https://docs.google.com/document/d/1SdGSfakQM3ZuiqJK7keXhOfh6310-z_h0THl1_Jswxk/pub

P/S: В документе я допустил опечатку, как показано ниже:

  • Предложение: «Я не думаю, что этот URL-адрес влияет на процесс аутентификации...» --> должно быть «Я не думаю, что этот URL-адрес влияет на процесс аутентификации…»

  • Слово "и готово" --> должно быть "и прочитано"

person datnt    schedule 14.11.2013