2013-07-30 14 views
7

Googleの新しい管理SDKを使用するのが難しいです。特に、Oauth2を使用するDirectory API 私はほとんどそこにいると思うが、私はDirectory API(私はGoogle Education Editionドメインを使用している)を使ってユーザーの詳細を取得しようとしている。Oauth2をサービスアカウント(教育用版)として使用しているGoogle Admin API - 403エラー

基本的に私がしようとしているのは、ADによって管理されている登録ステータスに基づいてユーザーをプロビジョニングまたはデプロビジョニングするPythonスクリプトを書くことです。私は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 APIをオンにして、それが動作するAdmin SDKの一部であることを確認するディレクトリ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) 
関連する問題