Marketplace向けアプリケーションの構築

現在記述中です。

ManifestのSupport要素に指定する各URLについて

インストール時だけでなく、いくつかの状況からアプリケーションにリクエストが飛んできます。Manifestの「ApplicationManifest/Support」要素に記述するURLがそれぞれどの手順からリクエストされるか、を記述します。

それぞれのURLの指定において「?domain=${DOMAIN_NAME}」という記述をしておくことで、リクエストパラメータにAppsドメイン名が渡されます。

Link@rel="setup"

  • Apps管理者が「Add it now!」してアプリケーションをインストールする際の手順「3 External configuration」で「Configure application」で手順を進めるとき。
  • Apps管理者がDashboardでインストール済みアプリケーションを選択し、「Additional Setting」項の「Additional setup」をクリックしたとき。
前者の場合は、パラメータに「callback」というパラメータが付加されます。これはApps管理ページ(MarketplaceからAddItNowした時の手順の途中)へのURLになっているので、インストール時のセットアップが正常終了した場合にはそのURLへリダイレクトしてあげる必要があります。なんらかの事情でこのcallback用URLの値を失ってしまう場合、一応以下のようなURLでセットアップ手順を進めたページに戻すこともできます。
  • https%3A//www.google.com/a/cpanel/${domain}/DomainAppInstall?appId=${appId}&productConfigId=${productConfigId}&vendorId=${vendorId}&productListingId=${productListingId}&EXTERNAL_CONFIG=true
    • ${domain}はアプリケーションをインストールしたユーザのドメイン名です。
    • ${productConfigId}は確認方法が今のところ不明ですが、どのドメインにインストールしてもアプリケーションごとに同じ値が使われているように見えますので、適当なドメインにインストールして値を確認すると良いかもしれません。
    • ${vendorId}は、ベンダごとに決まった値のようです。これも実際にインストール手順中のcallbackパラメータを確認すると良いです。ViewVendorProfileページで使用されるvendorIdとは違う値のようです。
    • ${productListingId}は、アプリケーションのListingIDで、Marketplace上のアプリケーション用のURL(ViewVendorProfileで)
    • ${appId}はアプリケーションのIDです。MarketplaceのViewVendorProfileに並ぶアプリケーションの「View OAuth Consumer Key」のリンクをクリックすることでMarketplaceの2LeggedOAuth用のキーペアと一緒に確認できます。
後者の場合は「callback」パラメータが渡されませんが、下記のURLへリダイレクトする事でアプリケーションの設定ページに戻すことができます。
  • https://www.google.com/a/cpanel/${domain}/PikeplaceAppSettings?appId=${appId}&licenseNamespace=PACKAGE_GAIAID
    • ${domain}はアプリケーションをインストールしたユーザのドメイン名です。
    • ${appId}はアプリケーションのIDです。MarketplaceのViewVendorProfileに並ぶアプリケーションの「View OAuth Consumer Key」のリンクをクリックすることでMarketplaceの2LeggedOAuth用のキーペアと一緒に確認できます。

Link@rel="manage"

  • Apps管理者がDashboardでインストール済みアプリケーションを選択し、「Additional Setting」項の「Additional configration」をクリックしたとき。
下記のURLへリダイレクトする事でアプリケーションの設定ページに戻すことができます。
  • https://www.google.com/a/cpanel/${domain}/PikeplaceAppSettings?appId=${appId}&licenseNamespace=PACKAGE_GAIAID
    • ${domain}はアプリケーションをインストールしたユーザのドメイン名です。
    • ${appId}はアプリケーションのIDです。MarketplaceのViewVendorProfileに並ぶアプリケーションの「View OAuth Consumer Key」のリンクをクリックすることでMarketplaceの2LeggedOAuth用のキーペアと一緒に確認できます。

Link@rel="support"

  • Apps管理者がDashboardでインストール済みアプリケーションを選択し、「Support for this app」項の「Go online support」のリンクをクリックしたとき。

Link@rel="deletion-policy"

  • Apps管理者がDashboardでインストール済みアプリケーションを選択し、「Delete application」項の「See the developer's deletion policy」のリンクをクリックしたとき。
  • Apps管理者がDashboardからインストール済みアプリケーションの削除を実行した際の削除確認中の「See the developer's deletion policy」のリンクをクリックしたとき。

アプリケーションのページの注意点

ApplicationManifest/Extension@id="navLink"/Urlで指定するユニバーサルナビゲーションにもdomain要素を追加しておけば良いですが、エンドユーザは直接アプリのページに飛んでくるかもしれません。なので、Setup用のページ以外はLicenseされたAppsドメインか?のチェックは常に必要になるんじゃないかと思います。

そういった用途にLicensingAPIというのがありますが、このAPIについては情報が少ないのでこのページの後半でも使い方やサンプルなどを説明します。

AppEngineで実装する際の注意点

AppEngineにはFederatedLoginという機能があり、ものすごい簡単にGoogle AppsアカウントによるSSOをサポートできます。が、いくつか注意点があります。

  • UserServiceで取得されるcurrentUserが、対象ドメインのものかどうか?の確認が必要。利用者が複数のドメインからアプリケーションを使用している際には、別のドメインで使用していた状態でSignOnしている場合もあります。その場合は一度LogoutURLへ転送して、そのcallbackURLで手順を続行するためのURLを指定する必要があります。
    • セットアップや設定系の機能については、常にドメインを指定する必要があります。
    • もしドメインがパラメータに渡されない場合は、あきらめるか、federatedIdentifyからドメインを抽出するしかありません。
      • ユーザがいきなりアプリケーションのURLを叩いて飛んでくる場合はこの方法を使うことになります。

AppEngine用のサンプル

Slim3のControllerを使ったサンプルです。setUp()メソッドで認証周りについて処理をしています。

Link@rel="setup"

Link@rel="manage"

ApplicationManifest/Extension@id="navLink"/Url

エンドユーザがユニバーサルナビゲーションから使用する、アプリケーションのトップページといえるものです。

LicenseAPIについて

  • リクエストしてきたユーザの該当のドメインが、アプリケーションをどのような状態に設定しているか?という点について、LicensingAPIを使って知ることができます。2010/09時点では以下の2種類のAPIが存在しています。

License Status

  • ドメイン名を指定して、そのドメインがアプリケーションをインストール済み(LICENSED)かそうでない(UNLICENSED)か、といった情報を取得できます。
    • また、LICENSEDであっても、enabledになっているかどうかも返されます。
      • 管理パネルを見るとわかりますが、インストールしたアプリケーションをdisabledな状態にする事もできます。

License Notification

  • 日時とMarketplace内のappIDを指定して、指定した日時以降に対象のアプリケーションをインストールしたドメインの情報が取得できます。
    • インストールした、という通知なだけで「disabledにした」という通知は存在しないようです。

実装について

その他のgdataAPIやAppsAPIのようなライブラリはまだ提供されていないので、自前で実装する必要があります。が、Marketplace用の2LOを使った認証のための処理(Authorizationヘッダの生成だけですが)は通常のGData用のライブラリが使用できますので、以下のようにGDataRequestを直接使うことでレスポンスを受け取ることができます。

GDataRequest request = service.createFeedRequest(url);

request.execute();

InputStream inputStream = request.getParseSource().getInputStream();

後はXMLとして解析すれば良いです。フォーマットについては http://code.google.com/intl/ja/googleapps/marketplace/licensing.html#licensed や http://code.google.com/intl/ja/googleapps/marketplace/licensing.html#notifications を参考にすれば良いです。

サンプルソースコードをgithubに置いてありますので、そちらも参考になると思います。このサンプルでは、一階層のデータを取得するだけ(実際それで十分)の単純なSAXParserで解析しています。

なお、サンプルソースコードはリトライなどAppEngine用に特化した仕組みをつかうようにしているので、AppEngineからの利用を考えている場合は下記のフォルダ内のソースも参考になるかもしれません。

Marketplaceへの登録手順について

下記の記事に書いてあります。Marketplaceがリリースされた直後の記事なので、少し古い点もあるかもしれませんが手順自体はおおよそ変わっていません(2010/09)。
Comments