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

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

このチュートリアルでは、Google People アプリと APIChrome 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 FaceBlcok",
...
  "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 FaceBlcok",
  ...
  "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 FaceBlcok",
  ...
  "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);
                  });
            };
          });
    });
  });
};

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

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