2015-07-03 1 views
1

Я обновляю проект python App Engine от старого API администратора Google Admin до нового и с трудом получаю аутентификацию (AppAssertionCredentials).Получение AppAngine AppAssertionCredentials работает (Python)?

Я уже

  • Включено в API администратора SDK в консоли разработчиков
  • Enabled доступ API в панели управления Служб Google

Чтобы обойти эту проблему, я создал учетную запись службы от Консоли разработчиков, загрузите учетные данные.json и установите следующие разрешения (без кавычек) в панели управления Google Apps (Security> Дополнительные настройки> Manage API client access) для этой учетной записи:

Мой текущий код (слегка отредактированный)

# ... 

import json 
from google.appengine.api import memcache 
from googleapiclient.discovery import build 
from httplib2 import Http 
from oauth2client.client import SignedJwtAssertionCredentials 

GAPPS_CREDENTIALS = 'credentials.json' 
GAPPS_SCOPES = [ 
    'https://www.googleapis.com/auth/admin.directory.user.readonly', 
    'https://www.googleapis.com/auth/admin.directory.group.readonly', 
    'https://www.googleapis.com/auth/admin.directory.group.member.readonly' 
] 
GAPPS_ADMIN = 'admin' 
GAPPS_DOMAIN = 'domain.com' 
GAPPS_USER = 'user' 

# ... 

with open(GAPPS_CREDENTIALS) as jsonfile: 
    jsondata = json.load(jsonfile) 
    credentials = SignedJwtAssertionCredentials(
    jsondata['client_email'], 
    jsondata['private_key'], 
    scope=GAPPS_SCOPES, 
    sub=GAPPS_ADMIN+'@'+GAPPS_DOMAIN 
) 

http = credentials.authorize(Http(memcache)) 
apps = build('admin', 'directory_v1', http=http) 
user = apps.users().get(userKey=GAPPS_USER +'@'+GAPPS_DOMAIN).execute() 
console.log(user['email']) 

# ... 

Это работает отлично, однако, если можно, я хотел бы удалить файл credentials.json с помощью вызова AppAssertionCredentials для аутентификации.

Как только я запускаю следующий код, однако:

# ... 

import json 
from google.appengine.api import memcache 
from googleapiclient.discovery import build 
from httplib2 import Http 
from oauth2client.appengine import AppAssertionCredentials 

GAPPS_CREDENTIALS = 'credentials.json' 
GAPPS_SCOPES = [ 
    'https://www.googleapis.com/auth/admin.directory.user.readonly', 
    'https://www.googleapis.com/auth/admin.directory.group.readonly', 
    'https://www.googleapis.com/auth/admin.directory.group.member.readonly' 
] 
GAPPS_ADMIN = 'admin' 
GAPPS_DOMAIN = 'domain.com' 
GAPPS_USER = 'user' 

# ... 

credentials = AppAssertionCredentials(scope=GAPPS_SCOPES,sub=GAPPS_ADMIN+'@'+GAPPS_DOMAIN) 
http = credentials.authorize(Http(memcache)) 
apps = build('admin', 'directory_v1', http=http) 
user = apps.users().get(userKey=GAPPS_USER +'@'+GAPPS_DOMAIN).execute() 
console.log(user['email']) 

# ... 

Я получаю 403 ошибку:

<HttpError 403 when requesting https://www.googleapis.com/admin/directory/v1/users/user%domain.com?alt=json returned "Not Authorized to access this resource/api"> 

Я подозреваю, что проблема может быть, что встроенная учетная запись службы не аутентифицирован в Google Apps Dashboard, однако я не могу найти домен учетной записи либо в Консоли разработчика, либо в консоли App Engine, чтобы иметь возможность добавлять эти разрешения. Я пробовал:

  • добавить все учетные записи служб, найденные при Developers Console> Права доступа, изменение @ developer.gserviceaccount.com к .apps.googleusercontent.com (@ cloudservices.gserviceaccount.com счет вызывает ошибку: This client name has not been registered with Google yet.)
  • с помощью {} проекта .appspot.com домена Служб Google ошибки с This client name has not been registered with Google yet.

Может кто-нибудь пролить свет?

Благодаря

+0

Вы когда-нибудь находили решение этого? Я нахожусь в одной лодке - могу использовать автономный файл секретов, но независимо от того, сколько раз я просматриваю браузер через https://developers.google.com/identity/protocols/OAuth2ServiceAccount и связанные ссылки, я не могу найти имя клиента, которое работает для учетной записи службы по умолчанию. – Bill

+0

К сожалению, не нужно было использовать файл credentials.json. –

ответ

3

Чтобы ответить на вопрос о том, где найти адрес электронной почты форму учетной записи службы двигателя по умолчанию App: Это находится в новой консоли в разделе Разрешения -> Учетных записи служб (в отличие от API менеджера -> Учетные данные для учетных записей служб, которые вы создаете сами).

Теперь, чтобы ответить на главный вопрос: AppAssertionCredentials не будет работать для учетных записей служб с делегированным доступом, так как он does not accept a 'sub' parameter для конструкторы и doesn't have a method for creating delegated credentials (он не используется в качестве ключевого слова аргумента, как с SignedJwtAssertionCredentials, который сейчас ServiceAccountCredentials, и игнорируются).Однако вы все равно сможете использовать учетную запись службы по умолчанию для App Engine с делегированием, поскольку новая консоль теперь позволяет вам create JSON keys for the default service accounts.

Возможна поддержка делегированного доступа с помощью AppAssertionCredentials, и для этого вы можете отправить запрос функции на project issue tracker.

Смежные вопросы