OAuth2: Google でユーザーを認証する

OAuth2 は、業界標準の承認プロトコルです。これによりユーザーは ユーザー名を共有することなく、ウェブ アプリケーションやデスクトップ アプリケーションに個人情報へのアクセスを許可する。 認証情報を取得できます。

このチュートリアルでは、Google People アプリと API と Chrome Identity API。拡張機能は HTTPS 経由では読み込めないため、 Cookie の設定にかかわらず、OAuth2 の使用には Chrome Identity API が使用されます。

始める

まず、ディレクトリと次のスターター ファイルを作成します。

完成した拡張機能はこちらからダウンロードできます。

manifest.json

manifest.json というファイルを作成し、次のコードを記述して、マニフェストを追加します。または こちらからファイルをダウンロードしてください。

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 2,
  "browser_action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  }
}

background.js

background.js というファイルを作成し、次のコードを記述して、バックグラウンド スクリプトを追加します。 または、こちらからファイルをダウンロードしてください。

chrome.browserAction.onClicked.addListener(function() {
  chrome.tabs.create({url: 'index.html'});
});

index.html

index.html という HTML ファイルを追加し、次のコードを含めます。または、こちらからファイルをダウンロードしてください。

<html>
  <head>
    <title>FriendBlock</title>
    <style>
      button {
        padding: 10px;
        background-color: #3C79F8;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <button>FriendBlock Contacts</button>
    <div id="friendDiv"></div>
  </body>
</html>

デベロッパー ダッシュボードにアップロードする

拡張機能のディレクトリを .zip ファイルにパッケージ化し、Chrome Developer ダッシュボードをご覧ください。

  1. デベロッパー ダッシュボードで [新しい項目を追加] をクリックします。
  2. [Choose file] をクリックし、.zip 拡張機能ディレクトリを選択してアップロードします。
  3. その他の欄に入力しない場合は、[下書きを保存してダッシュボードに戻る] を選択します。

[リスティング] で拡張機能を見つけて、[詳細] をクリックします。ポップアップで 解凍したディレクトリの "key" フィールドの下でマニフェストに追加します。

{
  "name": "OAuth Tutorial FriendBlock",
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8G...AQAB"
}

ID を比較

chrome://extensions で拡張機能の管理ページを開き、デベロッパー モードが有効になっていることを確認します。 パッケージ化されていない拡張機能のディレクトリをアップロードします。拡張機能の管理ページで拡張機能 ID を比較する をデベロッパー ダッシュボードのアイテム ID に変更します。両者は一致するはずです。

広告表示オプションの ID はすべての場所で一致します

マニフェストに "key" フィールドを含めることで、拡張機能は同じ ID を維持します。予測値を保持する API の登録には単一の ID が不可欠です。

OAuth クライアント ID の作成

Google API Console に移動して、新しいプロジェクトを作成します。準備ができたら [認証情報] のサイドバーで [認証情報を作成] をクリックし、[OAuth クライアント ID] を選択します。

拡張機能の認証情報を作成

[クライアント ID の作成] ページで [Chrome アプリ] を選択します。広告表示オプションの名前と場所を入力します 拡張機能 ID は、[Application ID] フィールドの URL の末尾で確認できます。

広告表示オプションの情報を入力する

最後に [作成] をクリックします。コンソールに OAuth クライアント ID が表示されます。

マニフェストに OAuth を登録する

拡張機能のマニフェストに "oauth2" フィールドを含めます。生成された OAuth クライアント ID を "client_id"。ここでは、"scopes" に空の文字列を含めます。

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes":[""]
  },
  ...
}

最初の OAuth フローを開始する

マニフェストに identity 権限を登録します。

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "permissions": [
    "identity"
  ],
  ...
}

OAuth フローを管理する oauth.js という名前のファイルを作成し、次のコードを含めます。ダウンロード こちらをご覧ください。

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      console.log(token);
    });
  });
};

oauth.js のスクリプトタグを index.html の先頭に配置します。

...
  <head>
    <title>FriendBlock</title>
    ...
    <script type="text/javascript" src="oauth.js"></script>
  </head>
...

拡張機能を再読み込みし、ブラウザ アイコンをクリックして index.html を開きます。コンソールを開いて 「FriendBlock Contacts」をクリックします] ボタンを離します。コンソールに OAuth トークンが表示されます。

コンソールでトークンを表示する

Google People API を有効にする

Google API コンソールに戻り、サイドバーから [Library] を選択します。「Google ユーザー」を検索する 正しい結果をクリックして有効にしてください。

People API を有効にする

拡張機能のマニフェストの "scopes" に Google People API クライアント ライブラリを追加します。

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/contacts.readonly"
    ]
  },
  ...
}

Google API Console に戻り、認証情報に戻ります。[認証情報を作成] をクリックしますおよび [API キー] を選択選択します

People API の認証情報を作成する

生成された API キーは、後で使用できるように保存しておきます。

最初の API リクエストを作成する

拡張機能に適切な権限と認証情報が設定され、Google ユーザーを認証できるようになったので、拡張機能は データをリクエストしたりできますoauth.js のコードを以下のように更新します。

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
          init)
          .then((response) => response.json())
          .then(function(data) {
            console.log(data)
          });
    });
  });
};

API_KEY は、Google API Console で生成された API キーに置き換えます。拡張機能 people/account_id の配列を含む JSON オブジェクトを memberResourceNames フィールド。

顔のブロック

拡張機能はユーザーの連絡先のリストを返すようになったので、追加のリクエストを行うことができます。 その連絡先のプロフィールと情報を取得します。この拡張機能は memberResourceNames: ユーザーの連絡先の写真情報を取得します。oauth.js を次に更新: 次のコードを追加します。

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=<API_Key_Here>',
          init)
          .then((response) => response.json())
          .then(function(data) {
            let photoDiv = document.querySelector('#friendDiv');
            let returnedContacts = data.memberResourceNames;
            for (let i = 0; i < returnedContacts.length; i++) {
              fetch(
                  'https://people.googleapis.com/v1/' + returnedContacts[i] +
                      '?personFields=photos&key=API_KEY',
                  init)
                  .then((response) => response.json())
                  .then(function(data) {
                    let profileImg = document.createElement('img');
                    profileImg.src = data.photos[0].url;
                    photoDiv.appendChild(profileImg);
                  });
            };
          });
    });
  });
};

拡張機能を再読み込みして戻ります。[フレンドブロック] ボタンをクリックすれば、連絡先の顔を認識する ブロックします。

ブロック内の顔に接触する