2016-04-19 3 views
1

Итак, у меня запущено приложение Python, которое использует учетную запись службы в нашем домене. Все это работает нормально, и учетной записи службы был предоставлен доступ к правильной области. Я использую следующий, который поднятый из одного из примеров Google:Делегирование доступа в Google API/Python

from __future__ import print_function 
import httplib2 
import os 
import pprint 
import sys 

from apiclient.discovery import build 
from oauth2client.service_account import ServiceAccountCredentials 

"""Email of the Service Account""" 
SERVICE_ACCOUNT_EMAIL = '[email protected]' 

"""Path to the Service Account's Private Key file""" 
SERVICE_ACCOUNT_CLIENT_FILE_PATH = 'My Project-xxxxxx.json' 

def main(): 
    scopes = ['https://www.googleapis.com/auth/drive.metadata.readonly'] 
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
      SERVICE_ACCOUNT_CLIENT_FILE_PATH, 
      scopes=scopes 
     ) 

    http = httplib2.Http() 

    http = credentials.authorize(http) 

    service = build('drive', 'v3', http=http) 

    results = service.files().list(
     pageSize=10,fields="nextPageToken, files(id, name)").execute() 
    items = results.get('files', []) 
    if not items: 
     print('No files found.') 
    else: 
     print('Files:') 
     for item in items: 
      print('{0} ({1})'.format(item['name'], item['id'])) 

if __name__ == '__main__': 
    main() 

Это успешно получающие документы для учетной записи службы. Теперь я понимаю, что я должен иметь возможность делегировать доступ, чтобы я мог работать как другой пользователь. Поэтому я добавляю следующую строку:

delegated_credentials = credentials.create_delegated("[email protected]_domain.org.au") 

, а затем с помощью deletegated_credentials при авторизации. На данный момент я получаю ошибку

oauth2client.client.HttpAccessTokenRefreshError: access_denied: Requested client not authorized.

Так что мое предположение о том, что пользователь, который я указать не имеет доступа к API. Правильно ли это, или я пропущу что-то очевидное?

ответ

0

Нашли свою ошибку, разместив здесь для будущих поколений. Моя область действия в коде python была неправильной, не понимал, что нужно точно соответствовать области, предоставленной в клиенте администратора !

Объем в клиенте администратора следующий:

https://www.googleapis.com/auth/admin.reports.audit.readonly https://www.googleapis.com/auth/drive

и область действия в коде;

scopes = ['https://www.googleapis.com/auth/admin.reports.audit.readonly','https://www.googleapis.com/auth/drive'] 

Я знаю, что я не нужен объем отчетов, но дело в том, если они не совпадают, то это не будет работать.

Rookie ошибка!

+0

Большое спасибо за этот пост, но как вы находите «область действия в клиенте администратора»? На какой странице именно? Заранее спасибо – benoit

+0

Прошло некоторое время с тех пор, как я посмотрел на это, но я думаю, что он находится на странице https://console.cloud.google.com/apis/api/admin.googleapis.com/overview в консоли разработчика. – ajcooper

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