С клиентом 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
. Любые предложения о том, как я могу заставить это работать?
Спасибо
Ответы
Ответ 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.