Подтвердить что ты не робот

С клиентом API Google, как создать клиент

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

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

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

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 get 'для # Вы имели в виду? gem`

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

Спасибо

4b9b3361

Ответ 1

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

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

gem "google-api-client" по-прежнему находится в альфе и довольно быстро продвигается, после многих проблем я смог работать с аутентифицированными вызовами в Youtube, Gmail и Analytics APIS. Я надеюсь, что 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

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

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

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

Ответ 3

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

get()

Для клиента и auth я бы рекомендовал попробовать клиент Hurley и аутентификацию Signet:: OAuth2:: Client.