OAuth2: аутентификация пользователей с помощью Google

OAuth2 — это стандартный протокол авторизации. Он предоставляет пользователям механизм предоставления веб-приложениям и настольным приложениям доступа к частной информации без раскрытия имени пользователя, пароля и других личных учетных данных.

В этом руководстве создается расширение, которое получает доступ к контактам Google пользователя с помощью Google People API и Chrome Identity API . Поскольку расширения не загружаются через HTTPS, не могут выполнять перенаправление или устанавливать файлы cookie, для использования OAuth2 они полагаются на Chrome Identity API.

Начать

Начните с создания каталога и следующих стартовых файлов.

Полное завершенное расширение можно скачать здесь .

манифест.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
  }
}

фон.js

Добавьте фоновый скрипт, создав файл с именем background.js и включив следующий код. Или скачайте файл здесь .

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

index.html

Добавьте HTML-файл с именем index.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 , не публикуя:

  1. На панели управления разработчика нажмите «Добавить новый элемент» .
  2. Нажмите «Выбрать файл» , выберите каталог с расширением .zip и загрузите его.
  3. Не заполняя дополнительные поля, выберите «Сохранить черновик» и вернитесь в личный кабинет .

Найдите расширение в разделе «Ваши объявления» и нажмите «Подробнее» . Из всплывающего окна скопируйте открытый ключ и добавьте его в манифест внутри разархивированного каталога в поле "key" .

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

Сравнить идентификаторы

Откройте страницу управления расширениями по адресу chrome://extensions , убедитесь, что режим разработчика включен, и загрузите каталог распакованных расширений. Сравните идентификатор расширения на странице управления расширениями с идентификатором элемента на панели разработчика. Они должны совпадать.

ID расширения совпадает во всех местах

Расширение будет поддерживать тот же идентификатор, включив поле "key" в манифест. Сохранение единого идентификатора необходимо для регистрации API.

Создать идентификатор клиента OAuth

Перейдите в консоль Google API и создайте новый проект. Когда все будет готово, выберите «Учетные данные» на боковой панели, нажмите «Создать учетные данные» и выберите идентификатор клиента OAuth .

Создайте учетные данные для расширения

На странице «Создать идентификатор клиента» выберите «Приложение Chrome» . Заполните имя расширения и поместите идентификатор расширения в конце URL-адреса в поле «Идентификатор приложения».

Заполните информацию о расширении

Завершите, нажав «Создать». Консоль предоставит идентификатор клиента OAuth.

Зарегистрируйте OAuth в манифесте

Включите поле "oauth2" в манифест расширения. Поместите сгенерированный идентификатор клиента OAuth в "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 и выберите «Библиотека» на боковой панели. Найдите «Google People API», щелкните правильный результат и включите его.

Включить API людей

Добавьте клиентскую библиотеку Google People API в "scopes" манифеста расширения.

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

Вернитесь в консоль Google API и вернитесь к учетным данным. Нажмите «Создать учетные данные» и выберите «Ключ API» из раскрывающегося списка.

Создание учетных данных People API

Сохраните сгенерированный ключ API для дальнейшего использования.

Создать первый запрос API

Теперь, когда расширение имеет необходимые разрешения, учетные данные и может авторизовать пользователя Google, оно может запрашивать данные через People API. Обновите код в 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 ключом API, сгенерированным из консоли Google API. Расширение должно регистрировать объект JSON, который включает в себя массив people/account_id в 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);
                  });
            };
          });
    });
  });
};

Перезагрузитесь и вернитесь к расширению. Нажмите кнопку FriendBlock и та-да! Наслаждайтесь лицами контактов в блоке.

Контактные лица в блоке