2013-07-30 13 views
7

Ho difficoltà a utilizzare Google new Admin SDK. In particolare l'API Directory che utilizza Oauth2. Penso di esserci quasi ma non riesco a recuperare i dettagli di un utente utilizzando l'API Directory (sto usando un dominio Google Education Edition).API di amministrazione Google che utilizza Oauth2 per un account di servizio (Education Edition) - 403 Errore

Fondamentalmente quello che sto cercando di fare è scrivere uno script python che acconsenta o disintegra gli utenti in base al loro stato di iscrizione che è gestito dal nostro AD. Ho uno script che usa Oauth1 ma voglio aggiornarlo per usare Oauth2.

Ecco uno snippet di codice basato su alcuni esempi che ho trovato.

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) 

Questo pezzo di codice sembra connettersi correttamente ma quando provo a eseguire la query ottengo un errore 403.

ERRORE: https://www.googleapis.com/admin/directory/v1/users/[email protected]?alt=json tornato "Non autorizzato ad accedere a questa risorsa/api">

Il mio primo pensiero è stato perché non ho attivato questa API sulla console degli amministratori (Google API's console) ma ce l'ho. (In realtà ho attivato Admin SDK e non l'API Directory perché non è presente alcuna API di directory da attivare e, visto che è parte di Admin SDK, funzionerebbe?).

C'è un altro passaggio che mi manca o che ho fatto un errore stupido da qualche parte?

+0

Hai capito? Mi chiedo se l'API Directory (a.k.a. Admin SDK API), in particolare, possa essere utilizzata con un account di servizio e OAuth 2.0. (So ​​che altre API possono farlo). Ho la sensazione che sia possibile con OAuth 1.0, ma non l'ho ancora provato. –

+0

@EricWalker - Sì, vedere i commenti di seguito. – Bruce

risposta

6

Bruce,

sei abbastanza vicino.

paio di elementi:

codice in modo completo avrà un aspetto un po 'come questo:

# 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

Se si utilizza Ruby e 'Signet' di Google, alcune modifiche alla libreria sono attualmente necessarie per impersonare un amministratore o un utente con un ruolo delegato; vedere: https://github.com/google/signet/pull/33 –

0

Questo dovrebbe essere di aiuto: https://developers.google.com/drive/delegation

Quando affermare le credenziali necessarie per connettersi all'utente che sta per essere modificato. Dal link qui sopra, nota questa sezione:

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, 
scope='https://www.googleapis.com/auth/drive', sub=user_email) 
Problemi correlati