Проблемы API контактов Google из клиента JavaScript с аутентификацией OAuth2 - PullRequest
7 голосов
/ 13 сентября 2011

До сих пор боролись с этим в течение многих часов, Документы кажутся ужасными.По сути, я пытаюсь получить доступ для чтения к контактам пользователей, прошедших проверку подлинности OAuth2, используя либо Portable Contacts API , либо полноценный Contacts API .В Google недавно запущено , что позволяет OAuth2 .

Я могу получить доступ к контактам пользователей через API контактов, сначала попросив пользователя пройти аутентификацию с помощью области: "https://www.google.com/m8/feeds". Затем я могу получить их первые 25 контактов с помощью jQuery (показанный код CoffeeScript )

$.ajax
  url: "https://www.google.com/m8/feeds/contacts/default/full"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

Это работает, и я получаю данные JSON. Однако, почти невероятно, единственные контактыпорядок, который Google предоставляет (насколько я могу судить): « lastmodified » (серьезно wtf?). Мне нужно что-то более похожее на «лучших друзей» или «самых популярных».

Какиечто-то, что может сделать API переносимых контактов Google , (Да!). Конечно, я не могу получить успешный запрос на работу.

Во-первых, ячтобы пользователь прошел аутентификацию с помощью API переносимых контактов, перейдя по этой ссылке (обратите внимание на область действия: "https://www -opensocial.googleusercontent.com / api / people")

<a href="https://accounts.google.com/o/oauth2/authclient_id=457681297736.apps.googleusercontent.com&response_type=token&redirect_uri=http://localhost:3000/team&scope=https://www-opensocial.googleusercontent.com/api/people">Import Google Contacts</a>

Это прекрасно работает, и яполучить маркер доступа, переданный обратно.

Далее япопробуйте отправить ajax-запрос в API переносимых контактов

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  success: (data, status) ->
    console.log "The returned data", data

Но это возвращает ошибку 403

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data.

Есть идеи, что я делаю неправильно?

Приложение
Я нашел этот отчет об ошибке на форуме Google OAuth2, который советовал нам установить заголовок авторизации при работе с API Portable Contacts.Поэтому я попробовал вот так:

$.ajax
  url: "https://www-opensocial.googleusercontent.com/api/people/@me/@all"
  dataType: 'jsonp'
  data: { access_token: token, alt: 'json-in-script' }
  beforeSend: (xhr) ->
    xhr.setRequestHeader "Authorization", "OAuth #{token}"
  data: { access_token: token }
  success: (data, status) ->
    console.log "The returned data", data

Но я получаю ту же ошибку 403:

403 (The currently logged in user and/or the gadget requesting data, does not have access to people data

1 Ответ

6 голосов
/ 15 сентября 2011

Проблема в том, что вы, очевидно, не можете установить заголовок запроса на запрос JSONP. См. Ответ на этот вопрос для получения дополнительной информации.

Насколько я вижу, альтернативы:

  1. Используйте библиотеку JS API Google Contacts . Это только использует AuthSub, который сами по себе считают Google плохо. Я бы предпочел не делать этого. Любой другой сервис, с которым я взаимодействую, использует OAuth2.
  2. Используйте новые стандарты Ajax и XDomainRequest уровня 2, упомянутые в вопросе SO, с которым я связан. Однако они придут со своими проблемами. Это звучит как беспорядок в целом. Это не будет работать в старых браузерах, и мне придется выполнять множество функций обнаружения и т. Д. Я даже не знаю, будет ли API поддерживать эти функции.
  3. Сделайте все это на сервере. Это тоже не совсем идеально. Меньше, чем идеальный пользовательский опыт.

Это не должно быть так сложно, Google.

...