カテゴリー別アーカイブ: Google

GoogleのService Account認証に潜む invalid_grant 問題

| 2件の返信

Appleのイベントは見ましたか?
Spring forward.のことです。
いやぁ、まさかあんなサプライズがあるとは。。。
どうも、DiceK Mikamiです。

さて、今回は(Appleとは全然関係なく)Google API使うにあたって利用することになるService Account認証に潜む罠に関して取り上げてみたいと思います。
続きを読む

GoogleのAPIを利用したアプリケーションをGoogle Apps Marketplace (Chrome Web Store)で公開する方法 その2

| 1件のフィードバック

前回に引き続き、Google Apps Marketplaceへのアプリケーションの公開手順を紹介します。

手順

  1. 利用するAPIの登録
  2. アプリケーションの開発
  3. Chrome Web Storeへの登録
  4. インストールのテスト
  5. アプリケーションの公開とレビュー申請

今回は3から5の手順です。

注意事項

アプリケーションをGoogle Apps Marketplaceで公開することが目的ですが、アプリケーションの登録はChrome Web Storeのディベロッパーダッシュボードから行います。
また、アプリケーションの公開に伴い、初回の公開時のみ5ドルの支払いが必要となります。

続きを読む

GoogleのAPIを利用したアプリケーションをGoogle Apps Marketplace (Chrome Web Store)で公開する方法 その1

| コメントをどうぞ

Googleが公開しているアプリケーションのプラットフォームとして、
・Google Apps Marketplace(Google Apps for Work利用者向け)
・Chrome Web Store(Googleの個人アカウント向け)
があります。

現在私たちはGoogle Apps向けのポータルサービスとして、infoScoop for Google AppsをGoogle Apps Marketplaceで公開しています。
http://www.infoscoop4g.com/ja/

今回と次回の2回に分けて、GoogleのAPIを利用したアプリケーションを公開する方法を紹介します。
Google Apps Marketplaceに公開する場合もChrome Web Storeに公開する場合も、基本的な流れは同じです。
参考: https://developers.google.com/apps-marketplace/

手順

公開までの手順は大きく5つに分かれています。

  1. 利用するAPIの登録
  2. アプリケーションの開発
  3. Chrome Web Storeへの登録
  4. インストールのテスト
  5. アプリケーションの公開とレビュー申請

今回は1と2の手順です。

続きを読む

Google Apps Marketplace APIのCustomerLicense

| 1件のフィードバック

Marketplaceで公開している自分のアプリケーションが、あるドメインでインストールされているかをチェックするAPIです。

Google Apps Marketplace APIのCustomerLicense
https://developers.google.com/apps-marketplace/v2/reference/customerLicense

リファレンスページで試すが403エラー

以下のページの Try it! で試したのですが、403エラーが出てしまいました。
https://developers.google.com/apps-marketplace/v2/reference/customerLicense/get

403 Forbidden

Cache-Control:  private, max-age=0
Content-Encoding:  gzip
Content-Length:  135
Content-Type:  application/json; charset=UTF-8
Date:  Fri, 07 Nov 2014 04:43:55 GMT
Expires:  Fri, 07 Nov 2014 04:43:55 GMT
Server:  GSE

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "forbidden",
        "message": "Not authorized to access the application ID"
      }
    ],
    "code": 403,
    "message": "Not authorized to access the application ID"
  }
}

Stack Overflowの以下の投稿を参考にソースコードを作成したところ、APIを利用してアプリケーションのインストール状況を確認できました。
http://stackoverflow.com/questions/21410538/error-consuming-customerlicense-app-marketplace-with-service-account-oauth2

ソースコード

以下のパラメータを任意に設定します。

  • SERVICE_ACCOUNT_EMAIL: Service Accountのメールアドレス
  • SERVICE_ACCOUNT_PKCS12_FILE_PATH: ダウンロードしたP12ファイルのパス
  • APPLICATION_ID: Google Developer ConsoleのProject Number(数字12桁)
  • CUSTOMER_ID: インストール状況をチェックするドメイン名
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;

public class CustomerLicense {
    public static void main(String[] args) throws GeneralSecurityException, IOException {
        String SERVICE_ACCOUNT_EMAIL = "103425845188-onbg603ons33o9becsffdauc6akcb548@developer.gserviceaccount.com";
        String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "*****.p12";
        String SCOPE = "https://www.googleapis.com/auth/appsmarketplace.license";
        String APPLICATION_ID = "103425845188";
        String CUSTOMER_ID = "infoscoop.org";

        GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(new NetHttpTransport())
        .setJsonFactory(new JacksonFactory())
        .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
        .setServiceAccountScopes(Collections.singleton(SCOPE))
        .setServiceAccountPrivateKeyFromP12File(new File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
        .build();
        credential.refreshToken();
        String token = credential.getAccessToken();

        URL url = new URL("https://www.googleapis.com/appsmarket/v2/customerLicense/"+ APPLICATION_ID + "/" + CUSTOMER_ID);

        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setRequestProperty("Authorization", "Bearer "+token);
        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            try {
                    InputStreamReader isr = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8);
                    BufferedReader reader = new BufferedReader(isr);
                    String line;
                    while ((line = reader.readLine()) != null) {
                        System.out.println(line);
                    }
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }
}

実行結果

{"kind":"appsmarket#customerLicense","id":"103425845188/infoscoop.org","applicationId":"103425845188","customerId":"infoscoop.org","state":"ACTIVE","editions":[{"editionId":"default_edition","seatCount":-1}]}

Google Apps Scriptを触ってみた

| コメントをどうぞ

今回はGoogle Apps Scriptについて紹介します。

Google Apps Scriptとは

Google Apps Scriptはサーバーサイドのスクリプト言語です。
JavaScriptでプログラムを作成することで、Google Appsの様々なサービスに対して処理を実行することができます。

Google Apps Script — Google Developers
https://developers.google.com/apps-script/?hl=ja

Google Apps Scriptを触ったことない人は、以下のサイトが参考になると思います。

ドットインストール – Google Apps Script入門
http://dotinstall.com/lessons/basic_google_apps_script

トリガー

Google Apps Scriptの細かい説明は省略しますが、個人的に気に入っている機能である「トリガー」について紹介します。

トリガーとは、作成したプログラムを定期的に実行してくれる機能です。
定期実行する方法としては、Cronやタスクスケジューラなどがありますが、トリガーは数クリックで設定ができてGoogleが実行してくれるという手軽さがとてもよいです。

Alt

以下の形式で定期実行の間隔を指定できます。

  • 特定の日時
    • YYYY-MM-DD HH:MM 形式の日付
  • 分タイマー
    • 1, 5, 10, 15, 30分ごと
  • 時タイマー
    • 1, 2, 4, 6, 8, 12時間ごと
  • 日タイマー
    • 午前0時~1時, 午前1時~2時, … , 午後11時~午前0時
  • 週タイマー
    • 毎週月曜日, 毎週火曜日, … 毎週日曜日
    • 午前0時~1時, 午前1時~2時, … , 午後11時~午前0時
  • 月タイマー
    • 1, 2, … ,31
    • 午前0時~1時, 午前1時~2時, … , 午後11時~午前0時

このトリガーの機能を利用して、議事録ファイルを作成するスクリプトを書いてみました。
要件は以下の通りです。
続きを読む

Google Calendar API Ver3で2-legged OAuthを試してみた

| コメントをどうぞ

初めまして。infoScoop for Google Appsの開発を行っております中田と申します。

現在Google Calendar API Ver3.0が公開されています。このAPIではリクエスト認証にはOAuth2.0の使用が推奨されています。しかしAPIドキュメントによると現時点では2-legged OAuthを行う為にはOAuth 2.0のトークンは使えないので OAuth 1.0のトークン+APIキーを使えと記述されています。ところがAPIドキュメントには「OAuth 1.0のトークン+APIキー」の具体的な手法については特に記載されていません。色々調べてみるとGoogle Apps Developer Blogに以下の投稿がありました。

Calendar API v3, 2-legged OAuth & Java

今回はこのブログで紹介されているサンプルを実際に動かしてみました。
まず、Calendarサービスの初期化部分のコードです。

  public Calendar buildService() {
    HttpTransport transport = AndroidHttp.newCompatibleTransport();
    JacksonFactory jsonFactory = new JacksonFactory();

    // The 2-LO authorization section
    OAuthHmacSigner signer = new OAuthHmacSigner();
    signer.clientSharedSecret = "";

    final OAuthParameters oauthParameters = new OAuthParameters();
    oauthParameters.version = "1";
    oauthParameters.consumerKey = "";
    oauthParameters.signer = signer;

    Calendar service = Calendar.builder(transport, jsonFactory)
        .setApplicationName("")
        .setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
           @Override
           public void initialize(JsonHttpRequest request) {
             CalendarRequest calendarRequest = (CalendarRequest) request;
             calendarRequest.setKey("");
           }
         }).setHttpRequestInitializer(oauthParameters).build();
    return service;
}

上記のコード中の<CONSUMER_SECRET>、<CONSUMER_KEY>、<YOUR_API_KEY>については各アプリケーション固有の値を設定します。

Google Apps Marketplaceに登録されたアプリケーションの場合

アプリケーションがinfoScoop for Google AppsのようにGoogle Apps Marketplaceに登録されたアプリケーションの場合は、Google Apps MarketplaceのMy Vendor Profileから参照できる値を使用します。

<YOUR_API_KEY>についてはGoogle Apps Marketplaceにベンダー登録したアカウントでAPIコンソールを開き、「API Access」画面から確認できる値を使用します。

また、Google Appsの管理画面の 高度なツール >  認証 > サードパーティの OAuth クライアント アクセスを管理するから以下のCalendar APIのスコープを追加します。

https://www.googleapis.com/auth/calendar

もしくはGoogle Apps MarketplaceのListing Manifest中のスコープ設定に上記スコープを追加してください。

その他のアプリケーションの場合

Google Apps Marketplaceに登録されたアプリケーションではない場合はAPIコンソールからアプリケーション登録を行う必要があります。
まず、APIコンソールを開き、任意の任意のGoogleアカウントでログインします。

次に「Services」タブから使用するAPIを有効にします。今回の例では「Calendar API」をONにします。
初めてAPIの利用を行う場合には利用規約に同意する必要があります。

「API Access」タブを開き、「Create an OAuth 2.0 client ID…」から画面の指示に従いアプリケーションの登録を行います。


アプリケーションの登録が完了するとConsumer Key(Consumer ID)とConsumer Secretが参照できるようになります。ここで参照されるConsumer Key(Consumer ID)とConsumer Secretおよびアクセスキーを使用します。

ここまでの設定で前述のサンプルコードが動作するようになります。

 

APIの利用制限

APIキーを使用するAPIについてはAPIコンソールでの表示でも分かるとおり実行回数などに制限が加えられています。Calendar API Ver.3.0では1日あたり10000回までとなっています。

残念ながらGoogle Apps Marketplaceに登録したアプリケーションのConsumer Key Consumer Secretでもこの制限は有効となっています。現時点ではAPI実行回数の限定解除を行う為にはAPIコンソールからGoogleに対してお伺いを立てるしかないようです。