13

Я работаю, чтобы использовать API клиента Google: https://github.com/google/google-api-ruby-clientс клиентом API Google, как создать клиент

В частности, я хочу получить доступ к Google Contacts через клиента API Google, используя следующие google_contacts_api.rb: https://gist.github.com/lightman76/2357338dcca65fd390e2

Я пытаюсь использовать google_contacts_api.rb как и (х является намеренным и на самом деле правильные ключи):

require './lib/google_contacts_api.rb' 
auth = User.first.authentications.first 
client = OAuth2::Client.new('x', 'x', :site => 'https://accounts.google.com') 
oauth2_object = OAuth2::AccessToken.new(client, auth.token) 
x = ContactList::GoogleContactsApi.new(client, oauth2_object).all_contacts 

Это заблудших с undefined method получить»для # ли у а? gem`

Я считаю, что проблема заключается в том, что я не отправляю client правильно, и мне не удалось найти какой-либо документ или примеры, показывающие, как создать client. Любые предложения о том, как я могу заставить это работать?

Благодаря

+0

Вы проверили ответ Элвин здесь: HTTP: // stackoverflow.com/questions/25637485/access-google-contacts-api-on-ruby? –

+0

Какой знак: OAuth2 :: Клиент вы используете? – jpgeek

+0

@jpgeek У меня установлено следующее: gem 'signet', '0.7.3' – AnApprentice

ответ

9

Примечание: Как получить список контактов, как правило, требует аутентификация пользователя для чтения частного данных, в приведенном ниже примере я предполагаю, что у вас уже реализована аутентификация Oauth2 с достаточной областью, и вы получили действительный «токен» с этого первого шага.

Много устаревшей/запутанной документации в Интернете, поскольку аутентификация API API и API были обновлены многократно. Для меня наиболее полезной документации является один на http://www.rubydoc.info/github/google/google-api-ruby-client/

драгоценного камне «Google-апи-клиент» еще в альфа и двигается довольно быстро, после того, как много изо все сил, я был в состоянии работать с аутентифицироанными звонками на Youtube, Gmail и Analytics APIS. Я надеюсь, что API-интерфейс API работает одинаково.

Клиент API Ruby Google содержит все необходимое для управления аутентификацией API, а затем запрашивает авторизированные подпрограммы API. Не нужно бороться с Hurley, Signet или другими клиентами HTTP/Rest.

#Gemfile 
gem 'google-api-client' 


#Class file 
require 'google/api_client/client_secrets.rb' #Manage global google authentication 
require 'google/apis/youtube_v3' #To be replaced with the proper Contact API 

access = {...} #Credentials object returned by your Oauth strategy (gem 'omniauth-google-oauth2' works like a charm) 
secrets = Google::APIClient::ClientSecrets.new({ 
"web" => {"access_token" => access['token'], 
"refresh_token" => access['refresh_token'], 
"client_id" => "xxxxxxxx.apps.googleusercontent.com", 
"client_secret" => "xxxxxxxxxxxx"}}) 

client = Google::Apis::YoutubeV3::YouTubeService.new #As per the require line, update it with you service API 
client.authorization = secrets.to_authorization 
client.authorization.refresh! 

До сих пор client переменная является авторизованным и готов запросить объект, который я использую, как это, например, для того, чтобы найти содержание Youtube

client.list_searches('snippet', q: 'xxxxxx', type: 'channel'){ |res, err| 
+2

Для меня это была очень неприятная проблема. Написал сообщение в блоге, которое пришло к подобным выводам, как вы: https://medium.com/@_benrudolph/end-to-end-devise-omniauth-google-api-rails-7f432b38ed75 –

+1

Всегда ли вы запускаете 'refresh!' ? Нет необходимости совершать дополнительную поездку в Google, если «access_token» не истек. –

+0

@FellowStranger точно не реализован таким образом, но да, похоже, все правильно сохранить запрос, сначала проверив дату истечения срока действия фактического токена, прежде чем запрашивать обновление. – Roms

2

https://gist.github.com/lightman76/2357338dcca65fd390e2 говорит клиент должен быть клиент Херли. Похоже, вы пропускание OAuth2 :: Клиент, который по-видимому, не реагирует на

get() 

Для клиента и AUTH, я бы рекомендовал пытаться клиентом Херли и Signet :: OAuth2 :: Client Авт.

+0

Спасибо, но можете ли вы показать пример того, как это сделать? – AnApprentice

3

Вы получили эту ошибку, потому что используете минувшие объекты для
ContactList::GoogleContactsApi.new(client, auth). Этот факт предполагает, что для client экземпляр мертвых Hurley HTTP client и auth должен быть экземпляром OAuth2 от Google's Signet library. Вместо этого вы пытаетесь выполнить Intridea's OAuth2 libary.

Поскольку Херли мертвый проект, и что суть не хватает каких-либо модульных тестов, я рекомендую вам использовать проверенную и рабочую реализацию таких как google_contacts_api gem, который совместим с oauth2 библиотекой Intridea в:

require 'google_contacts_api' 

auth = User.first.authentications.first 
client = OAuth2::Client.new('x', 'x', :site => 'https://accounts.google.com') 
oauth2_object = OAuth2::AccessToken.new(client, auth.token) 
google_contacts_user = GoogleContactsApi::User.new(oauth2_object) 

Вопрос об освежающих токенах действительно относится к отдельному вопросу. Короче говоря, вы должны сделать запрос на получение нового маркеров периодически с помощью обновления маркеров Google обеспечивает:

data = { 
    :client_id => GOOGLE_APP_KEY, 
    :client_secret => GOOGLE_APP_SECRET, 
    :refresh_token => oauth2_refresh_token_for_user, 
    :grant_type => "refresh_token" 
} 
response = ActiveSupport::JSON.decode(RestClient.post("https://accounts.google.com/o/oauth2/token"), data) 
if response["access_token"].present? 
    puts response["access_token"] 
else 
    # No Token 
end 
rescue RestClient::BadRequest => e 
    # Bad request 
rescue 
    # Something else bad happened 
end 
+0

Спасибо, но этот пример не касается необходимости обновить токен, в котором я застрял. Любая идея, как обновить токен для этого рекомендуемого драгоценного камня? – AnApprentice

+0

Вам нужно будет обновить токен самостоятельно. См. Http://stackoverflow.com/questions/21707734/refresh-token-using-omniauth-oauth2-in-rails-application и https://github.com/zquestz/omniauth-google-oauth2/issues/37 для примеров , Я включил короткий выше. – fny

Смежные вопросы