2013-07-30 1 views
7

Google 새로운 Admin SDK를 사용하는 데 어려움이 있습니다. 특히 Oauth2를 사용하는 Directory API 저는 거의 다 왔다고 생각하지만 Directory API를 사용하여 사용자 세부 정보를 검색하려고했습니다 (Google Education Edition 도메인을 사용하고 있습니다).Oauth2를 서비스 계정 (교육용)으로 사용하는 Google Admin API - 403 오류

기본적으로 내가하려는 것은 우리 광고에 의해 관리되는 등록 상태에 따라 사용자를 프로비저닝하거나 프로비저닝 해제하는 파이썬 스크립트를 작성하는 것입니다. Oauth1을 사용하여이 작업을 수행하지만 Oauth2를 사용하도록 업데이트하려는 스크립트가 있습니다.

다음은 내가 발견 한 몇 가지 예를 기반으로 한 코드입니다.

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) 

이 코드는 올바르게 연결되어 있지만 쿼리를 실행하려고하면 403 오류가 발생합니다.

ERROR : https://www.googleapis.com/admin/directory/v1/users/[email protected]?alt=json 반환 "이 리소스/API에 액세스 할 수있는 권한이 없습니다">

내 첫 번째 생각은 관리자 콘솔 (Google API's console)에서이 API를 사용 설정하지 않았기 때문입니다. 실제로 작동 할 Admin SDK의 일부인 것을보고 켜기위한 Directory API가 없기 때문에 실제로 Directory API가 아닌 Admin SDK가 켜져 있습니다.

또 다른 단계가 있습니까? 아니면 어리석은 실수를 저질렀습니까?

+0

이것을 알아 냈습니까? Directory API (a.k.a. Admin SDK API)가 서비스 계정 및 OAuth 2.0과 함께 사용될 수 있는지 궁금합니다. (나는 다른 API가 할 수 있다는 것을 알고있다.) 나는 OAuth 1.0에서 그런 감각을 얻을 수 있지만, 아직 시도하지는 못했다. –

+0

@EricWalker - 네, 아래의 코멘트를 참조하십시오. – Bruce

답변

6

브루스,

당신이 아주 가까이있어 : 위의 링크에서이 부분을 유의하십시오. 항목의

커플 : 당신이 (변경되는 사용자를하지 않음) 사칭하고 누구

그래서 전체 코드는 약간 다음과 같이 표시됩니다

# 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

Ruby와 Google의'Signet'을 사용하는 경우 현재 위임 된 역할을 가진 관리자 또는 사용자로 가장하려면 라이브러리 수정이 필요합니다. https://github.com/google/signet/pull/33을 참조하십시오. –

0

이 도움이 될해야합니다 https://developers.google.com/drive/delegation

이 변경 될 것입니다 사용자에 연결하는 데 필요한 자격 증명을 주장.

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, 
scope='https://www.googleapis.com/auth/drive', sub=user_email) 
관련 문제