Я пытаюсь получить доступ к списку пользователей через приложение. Не могу заставить работать двустороннюю авторизацию. Я хочу иметь доступ к 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
- Deprecated
Я использую 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
), но только если я могу использовать двухэтапную аутентификацию, поскольку у меня есть бизнес-требование, чтобы не было третьего этапа.