Google Cloud Storage JSON API Client for JavaScript を試す(2)アクセス制御関係

http://d.hatena.ne.jp/noazoh/20150115/1421315583 の続き。

Googleアカウントによる認証をせずとも、対象バケットへのアクセスが出来るようにしてみる。

コード

次に、サンプルコードを次のように変更する。
531行目〜

    /**
     * Handle authorization.
     */
    function handleAuthResult(authResult) {
      var authorizeButton = document.getElementById('authorize-button');
      if (authResult && !authResult.error) {
        authorizeButton.style.visibility = 'hidden';
        //initializeApi(); この行をコメントアウト
        filePicker.onchange = insertObject;
      } else {
        authorizeButton.style.visibility = '';
        authorizeButton.onclick = handleAuthClick;
      }
    }

565行目〜

    /**
     * Driver for sample application.
     */
    $(window)
      .bind('load', function() {
        addSelectionSwitchingListeners();
        initializeApi();    //この行を追加
        handleClientLoad();
    });

何をやっているかというと、cloud storage APIの初期化を、アカウント認証後に行っていたのを、ページがロードされた時に行うように変更した。

テスト

ブラウザを立ち上げ、Googleアカウントがログインしていない状態にしたうえで、サンプルを実行する。
まず、プルダウンから、たとえば"list Objects" を選択する。
まず、バケットの権限を何もいじらない状態(バケットを作成した直後の状態)で実行すると、結果はこうなる。

API Response

{
 "code": 401,
 "data": [
  {
   "domain": "global",
   "reason": "required",
   "message": "Login Required",
   "locationType": "header",
   "location": "Authorization"
  }
 ],
 "message": "Login Required",
 "error": {
  "code": 401,
  "data": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "message": "Login Required"
 }
}

次に、バケットに対して、AllUsers にREAD権限を与えてみる。

gsutil acl set public-read gs://バケット名

そして、同じくプルダウンから、"list Objects" を選択すると、バケット内のオブジェクトの一覧が取得できるようになる。

API Response

{
 "kind": "storage#objects",
 "result": {
  "kind": "storage#objects"
   ...
 }
}