Chrome Extension開発を勉強してみる (20) - chrome.experimental.identity -

2012-09-30T00:00:00+00:00 Chrome Extension JavaScript

chrome.experimental.identityを使う事でGoogle APIsを使う際にアクセストークンを取得したり出来るらしい。っていうかそもそもがmanifest_versionが2からは外部URLのスクリプトをロードするのですらCSPにより制限されているので(ry

でChrome自体にChrome Syncっていうのが組み込まれているので、それの接続アカウントを利用してトークン取得出来る模様。なのでこれを使うとChrome Syncな設定が有効になる(同期するデータに関する件がいろいろあるので、そこは注意しないといけない)

更に現在では https://developers.google.com/console でクライアントID等を発行する事が出来ない。あくまでGoogle側の承認が必要な模様で、Dev Consoleから作ったクライアントIDをGoogle宛に送る事でidentity APIが使えるクライアントIDかなんかを送付してくれる模様

今回検証ではGoogleが検証で使ってると思われるクライアントID等を利用させてもらって検証してみた。Chrome Syncで接続されているGoogleサービスアカウントを利用してアクセストークンを取得して、それを利用しGmailのフィードを取得してみる

manifest.json

{
  "name": "test",
  "version": "0.1",
  "manifest_version": 2,
  "background": {
    "page": "background.html"
  },
  "permissions": ["experimental", "https://mail.google.com/"],
  "oauth2": {
    "client_id": "省略",
    "scopes": ["https://mail.google.com/mail/feed/atom"]
  }
}

background.html

<html>
  <body>
    <script type="text/javascript" src="background.js"></script>
  </body>
</html>

background.js

(function(undefined) {
  // アクセストークンを取得する (同期コネクトが確立してない場合は取得できない)
  chrome.experimental.identity.getAuthToken(
    { "interactive": false },
    function(token) {
      if (!token) {
        // 同期コネクトを確立するように要求してからアクセストークンを取る
        chrome.experimental.identity.getAuthToken(
          { "interactive": true },
          function(token) {
            getAccount(token, function(feed) {
              console.log(feed);
            });
          }
        );

        return;
      }

      getAccount(token, function(feed) {
        console.log(feed);
      });
  });
})();

function getAccount(token, cb) {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", "https://mail.google.com/mail/feed/atom");
  xhr.setRequestHeader("Authorization", "Bearer " + token); // Authorizaion: Bearerでアクセストークンを設定する
  xhr.onload = function() {
    if (xhr.status !== 200) {
      return;
    }

    cb(xhr.responseXML);
  };
  xhr.send(null);
}

終わり。成功したらバックグラウンドページ側のコンソールにGmail Feedのdocumentが出る

参考: http://developer.chrome.com/trunk/apps/app_identity.html

Sinon.JSを使ってXMLHttpRequestをテスト