Directory APIで 2-legged OAuth を使って認証

Google Appsのユーザー情報を同期しているappengineのアプリケーションでProvisioning APIを使用していましたが、deprecatedになっていました。(2015年で終了。。)
今後は Admin SDK Directory API を使用しろとのことなので、2-legged OAuthを使った使用方法を調査していましたがなかなか情報が見つからずに苦戦。。
試行錯誤の末ようやく成功したのでまとめてみます。

Directory API は ユーザーやグループのUniqueIDも取得できるので、メールアドレスの変更などにも追随できて管理がより楽になります。

サンプルコードの実行条件

  • appengine/java で GoogleAppsと連携するアプリケーション
  • Google Apps Marketplace に登録してある
  • AppsにはMarketplaceからインストールしてある

認証にはMarketplaceのCONSUMER_KEYとCONSUMER_SECRETを使用します。
またAppsの管理者権限があるID(メールアドレス)が必要になります。

ApplicationManifestに追加するスコープ

Google Apps Marketplaceの ApplicationManifestに以下のスコープが必要になります。


    <Scope id="userProvisioningAPI">
        <Url>https://www.googleapis.com/auth/admin.directory.user.readonly</Url>
        <Reason>This app displays all members in domain.</Reason>
    </Scope>
    <Scope id="groupProvisioningAPI">
        <Url>https://www.googleapis.com/auth/admin.directory.group.readonly</Url>
        <Reason>This app displays all groups in domain.</Reason>
    </Scope>

サンプルコード

まずはOAuthパラメータをセットしてDirectoryAPIインスタンスをビルドします。
2-legged OAuth は1.0にしか対応していないようで、API_KEYも使います。



        NetHttpTransport TRANSPORT = new NetHttpTransport();
        JacksonFactory JSON_FACTORY = new JacksonFactory();

        // The 2-LO authorization section
        OAuthHmacSigner signer = new OAuthHmacSigner();
        signer.clientSharedSecret = CONSUMER_SECRET;
     
        final OAuthParameters oauthParameters = new OAuthParameters();
        oauthParameters.version = "1";
        oauthParameters.consumerKey = CONSUMER_KEY;
        oauthParameters.signer = signer;
        //oauthParameters.signRequestsUsingAuthorizationHeader(transport);
        
        // Directory API構築
        directory = new Directory.Builder(
            TRANSPORT, JSON_FACTORY, null)
        .setApplicationName(APP_NAME)
        .setDirectoryRequestInitializer(new DirectoryRequestInitializer(API_KEY))
        .setHttpRequestInitializer(oauthParameters)
        .build();
        

ユーザー一覧の取得例です。customKeysにadminアカウントをセットします。


        customKeys = new ArrayMap<String,Object>();
        customKeys.add("xoauth_requestor_id", ADMIN_ACCOUNT);

        Directory.Users.List list = directory.users().list();
        list.setUnknownKeys(customKeys);
        list.setCustomer("my_customer");
        list.setMaxResults(USER_PAGE_MAX);

        List<User> result = new ArrayList<User>();
        for(;;) {
            Users users = list.execute();
            for (com.google.api.services.admin.directory.model.User u: users.getUsers()) {
                result.add(u);
            }
            if (users.getNextPageToken() != null) {
                list.setPageToken(users.getNextPageToken());
                continue;
            }
            break;
        }

setCustomer(“my_customer”); とすると管理下の全てのユーザーが取得できる。
次のページが有るかどうかは、nextPageTokenで判定。

OAuth 2.0 には対応していないようなんですが、どうなんでしょうか。少なくとも今のところ2.0でのやり方を見つけられていません。

コメントは受け付けていません。