2013-07-30 16 views
7

Mam problemy z używaniem nowego pakietu Google Admin SDK. W szczególności Directory API używający Oauth2. Myślę, że już prawie jestem, ale utknąłem, próbując odzyskać dane o użytkownikach za pomocą interfejsu Directory API (używam domeny Google Education Edition).Google Admin API używający Oauth2 do konta usługi (wersja edukacyjna) - błąd 403

Zasadniczo to, co próbuję zrobić, to napisanie skryptu python, który rezerwuje lub wycofuje użytkowników na podstawie ich statusu rejestracji zarządzanego przez naszą AD. Mam skrypt, który robi to za pomocą Oauth1, ale chcę go zaktualizować, aby używać Oauth2.

Oto fragment kodu na podstawie niektórych przykładów, które znalazłem.

f = file('test_key.p12', 'rb') 
key = f.read() 
f.close() 
credentials = SignedJwtAssertionCredentials(
    '[email protected]', 
    key, 
    scope= 'https://www.googleapis.com/auth/admin.directory.user') 
http = httplib2.Http() 
http = credentials.authorize(http) 
service = build(serviceName='admin', version='directory_v1', http=http) 

lists = service.users().get(userKey='[email protected]').execute(http=http) 
pprint.pprint(lists) 

Ten fragment kodu wygląda na poprawny, ale kiedy próbuję wykonać zapytanie, pojawia się błąd 403.

BŁĄD: https://www.googleapis.com/admin/directory/v1/users/[email protected]?alt=json powrócił "nie jest upoważniony do dostępu do tego zasobu/API">

Moja pierwsza myśl była, ponieważ nie włączałem tego interfejsu API na konsoli administratorów (Google API's console), ale mam. (Właściwie to włączyłem Admin SDK, a nie Directory API, ponieważ nie ma włączonego interfejsu Directory API i widzę, że jest to część pakietu SDK administratora, który by działał?).

Czy jest jeszcze jeden krok, którego mi brakuje, czy gdzieś popełniłem głupią pomyłkę?

+0

Czy to wymyśliłeś? Zastanawiam się, czy Directory Directory (a.k.a. Admin SDK API), w szczególności, może być używany z kontem usługi i OAuth 2.0. (Wiem, że inne interfejsy API mogą.) Mam wrażenie, że może to zrobić z OAuth 1.0, ale jeszcze tego nie próbowałem. –

+0

@EricWalker - Tak, patrz komentarze poniżej. – Bruce

Odpowiedz

6

Bruce

jesteś całkiem blisko.

Para przedmiotów:

Więc pełny kod będzie wyglądał trochę tak:

# domain configuration settings 
    import domainconfig 

    f = file(domainconfig.KEY_FILE, "rb") # b reads file in binary mode; not strictly necessary, but safer to avoid strange Windows EOL characters: https://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode 
    key = f.read() 
    f.close() 

    credentials = SignedJwtAssertionCredentials(

     domainconfig.SERVICE_ACCOUNT_EMAIL, 
     key, 
     scope = domainconfig.SCOPE, 
     sub=domainconfig.SUB_ACCOUNT_EMAIL # 'sub' supercedes the deprecated 'prn' 

    ) 

    http = httplib2.Http() 
    http = credentials.authorize(http) 

    directoryservice = build("admin", "directory_v1", http=http) 

    users = directoryservice.users() 
    response = users.get(userKey='[email protected]').execute() 
+0

Jeśli używasz Ruby i Google 'Signet', niektóre modyfikacje biblioteki są obecnie potrzebne do podszywania się pod administratora lub użytkownika z delegowaną rolą; zobacz: https://github.com/google/signet/pull/33 –

0

Powinno to być pomocne: https://developers.google.com/drive/delegation

Kiedy twierdząc poświadczenia należy podłączyć go do użytkownika, który ma zostać zmieniony. Z linku powyżej Uwaga ten dział:

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, 
scope='https://www.googleapis.com/auth/drive', sub=user_email) 
Powiązane problemy