Как использовать двухсторонний oauth с библиотекой python gdata?

Я пытаюсь получить доступ к списку пользователей через приложение. Не могу заставить работать двустороннюю авторизацию. Я хочу иметь доступ к API Google без согласия пользователя после установки. Библиотека gdata устарела в начале этого года, но бизнес-требование требует доступа к API без дополнительного согласия пользователя после того, как администратор домена установил приложение.

Вот что я сделал до сих пор:

  • Я создал приложение на Marketplace. Манифест приложения объявляет эту область:

    https://apps-apis.google.com/a/feeds/user/

  • Я установил свое приложение в тестовом домене и предоставил разрешения для указанной выше области.

  • Я просмотрел примеры здесь: https://code.google.com/p/gdata-python-client/source/browse/samples/oauth/

    • Deprecated Service approach: 2_legged_oauth.py
    • Обновленный подход Client: TwoLeggedOAuthExample.py

Я использую Python 2.7.5 и gdata 2.0.18. Вот мой код, адаптированный из приведенных выше примеров:

import gdata.gauth
import gdata.apps.client

CONSUMER_KEY = "[snip].apps.googleusercontent.com"
CONSUMER_SECRET = "[snip]"
requestor_id = '[email protected]'

client = gdata.apps.client.AppsClient(domain='mydomain.com', source='myapp-v1')
client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
    CONSUMER_KEY, CONSUMER_SECRET, requestor_id)
client.ssl = True

# Failure occurs here.
feed = client.RetrieveAllUsers()

Ответ:

<HTML>
<HEAD>
<TITLE>Unknown authorization header</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unknown authorization header</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

Вот подробности для отправляемых заголовков:

GET /a/feeds/mydomain.com/user/2.0?xoauth_requestor_id=myuser%40mydomain.com HTTP/1.1
Host: apps-apis.google.com
Accept-Encoding: identity
GData-Version: 2.0
Authorization: OAuth oauth_nonce="035378574830673", oauth_timestamp="1383593346", oauth_consumer_key="[snip].apps.googleusercontent.com", oauth_signature_method="HMAC-SHA1", oauth_version="1.0", oauth_signature="[snip]"
User-Agent: test-test-v1 gdata-py/2.0.18

Вот отладочная информация по ответу (взято из перевода atom.http_core.ProxiedHttpClient в режим отладки):

reply: 'HTTP/1.1 401 Unknown authorization header\r\n'
header: WWW-Authenticate: GoogleLogin realm="http://www.google.com/accounts/ClientLogin", service="apps"
header: Content-Type: text/html; charset=UTF-8
header: Date: Mon, 04 Nov 2013 19:33:35 GMT
header: Expires: Mon, 04 Nov 2013 19:33:35 GMT
header: Cache-Control: private, max-age=0
header: X-Content-Type-Options: nosniff
header: X-Frame-Options: SAMEORIGIN
header: X-XSS-Protection: 1; mode=block
header: Server: GSE
header: Alternate-Protocol: 443:quic
header: Transfer-Encoding: chunked

Как использовать двусторонний протокол oauth для доступа к пользователям в домене? Я открыт для использования более новых клиентов Google API (oauth2client и apiclient), но только если я могу использовать двухэтапную аутентификацию, поскольку у меня есть бизнес-требование, чтобы не было третьего этапа.




Ответы (1)


Я рекомендую вам прочитать документы, касающиеся сервисных аккаунтов OAuth2.

Двухсторонний OAuth устарел, API-интерфейсы gdata в значительной степени устарели, а сервисы apiclient стали намного чище и проще в использовании.

person AMS    schedule 05.11.2013
comment
У меня сложилось впечатление, что я не могу использовать сервисный аккаунт по следующим причинам: 1. goo.gl/NDZLj2 - Поддерживаются только определенные API (›1 год) 2. Ваша ссылка goo.gl/fj9KdX говорит: от имени приложения без доступа к пользовательской информации. Я считаю, что мне нужно получить доступ к информации о пользователе. 3. В этом SO q/a также говорится, что я не могу получить доступ к информации о пользователе с помощью учетной записи службы: goo.gl/utY5us - person jon; 05.11.2013
comment
Если я могу использовать учетные записи служб для доступа к тому, что я хочу (Admin SDK, API каталогов), то я бы предпочел использовать это, у меня просто сложилось впечатление, что это не поддерживается, поскольку я буду получать доступ к данным пользователя. Это не точно? - person jon; 05.11.2013
comment
Мое единственное отвращение к использованию более новых библиотек и API заключается в том, что у меня есть бизнес-требование, которое предотвращает третью часть потока OAuth2 (дополнительное согласие пользователя). - person jon; 05.11.2013
comment
Прочтите еще раз документ (developers.google.com/accounts/docs/OAuth2ServiceAccount). и выполните поиск дополнительных утверждений (prn). МОЖНО выдать себя за пользователя с учетными записями служб, независимо от того, что говорит пользователь с показателем репутации 3742. Мы делаем. Вы тоже должны уметь. - person AMS; 06.11.2013
comment
Пример, приведенный в библиотеке API Python, не использует «prn»: code.google.com/p/google-api-python-client/source/browse/ - person jon; 06.11.2013
comment
Просто добавьте prn=username@thedomain в вызов конструктора SignedJwtAssertionCredentials, и вызовы с этими учетными данными будут выполняться от имени этого пользователя. - person AMS; 06.11.2013
comment
Привет, Джон, у меня возникла точно такая же проблема при попытке использовать oauth2 с gdata. (на самом деле я переношу код с oauth1 на oauth2, поэтому у меня есть два ограничения: использование учетных записей служб и использование библиотеки gdata). Как вы решили проблему? - person Meriam-K; 23.10.2014
comment
У меня была аналогичная проблема, и я решил ее с помощью этого шаблона в своем ответе: stackoverflow.com/questions/26925125/ - person Ani; 20.11.2014