Для некоторых операций с использованием API данных YouTube требуется больше, чем ключ API - в некоторых случаях вам потребуется использовать OAuth2. В этом примере (вы можете получить полный код из моего GitHub здесь) мы рассмотрим, как использовать OAuth для настройки веб-приложения для чтения содержимого частного списка воспроизведения с помощью API данных Google.

Мы напишем модуль узла под названием YouTubeAuthService, у которого есть несколько зависимостей, которые мы хотим загрузить в верхней части файла:

'use strict';
var Promise = require('bluebird');
var google = require('googleapis');
var OAuth2 = google.auth.OAuth2;

Мы также хотим установить несколько переменных, которые должны оставаться в секрете (сделайте их настраиваемыми переменными и не жестко запрограммируйте их в свой проект):

var CLIENT_ID = process.env.CLIENT_ID;
var CLIENT_SECRET = process.env.CLIENT_SECRET;
var REDIRECT_URL = process.env.REDIRECT_URL;
var refresh_token = process.env.refresh_token;

Чтобы получить значения для CLIENT_ID и CLIENT_SECRET, вам необходимо войти в учетную запись Google, связанную с вашим каналом YouTube, и посетить Консоль разработчика Google. (Мы получим значение refresh_token позже, когда перейдем к экрану согласия.)

Нажмите «Создать проект», чтобы зарегистрировать свое веб-приложение:

Примите условия и нажмите «создать».

Вы увидите следующее диалоговое окно:

Вам нужно выбрать «Идентификатор клиента OAuth». Настройте экран согласия с названием продукта и обязательно выберите «Веб-приложение» в списке переключателей для типа приложения. Введите имя своего веб-приложения и нажмите «Создать».

Вам нужно скопировать свой идентификатор клиента и секрет клиента в открывшееся модальное окно и сохранить их, потому что позже мы будем использовать их в качестве значений для переменных среды CLIENT_ID и CLIENT_SECRET при запуске модуля, который мы пишем. (Вы также захотите ввести действительный URL в поле URI авторизованного перенаправления - для наших целей это может быть любой действительный URL, который вы хотите; я объясню почему позже.)

Затем вам нужно выбрать, к какому API вы хотите, чтобы ваши учетные данные могли получить доступ.

Давайте включим API данных YouTube:

Затем нам нужно добавить хотя бы один авторизованный URL-адрес перенаправления, на который мы можем быть перенаправлены после посещения экрана согласия. Убедитесь, что это действительный URL (и не забудьте нажать «Сохранить» после того, как добавили его).

Теперь, когда мы включили API, который хотим использовать, добавили один или несколько действительных URL-адресов для перенаправления и получили значения для нашего идентификатора клиента и секрета клиента, мы собираемся использовать эти значения для получения токена обновления. . Этот токен не имеет срока действия и позволяет нам получать токены доступа для выполнения запросов API YouTube от вашего имени. При получении этого токена появляется экран согласия.

Чтобы создать экран согласия, давайте сначала приступим к реализации службы API YouTube в Node.js:

var YouTubeAPIService = function YouTubeAPIService(){
  this.OAuth2Client = null;
  this.youtube = null;
};
YouTubeAPIService.prototype.initialize = function initialize(what){
  var self = this;
  if(what==='Client'){
    self.OAuth2Client = new OAuth2(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);
  }else if(what==='Tokens'){
    self.OAuth2Client.setCredentials({
      refresh_token: refresh_token
    });
    return new Promise(function(resolve, reject){
      self.refreshAccessToken()
        .then(function(response){
          console.log(self.OAuth2Client);
          self.youtube = google.youtube({
            version: 'v3',
            auth: self.OAuth2Client
          });
          resolve('YouTube oAuth client authenticated.');
        })
        .catch(function(err){
          console.log(err);
          reject(err);
        });
    });
  }
};
YouTubeAPIService.prototype.refreshAccessToken = function refreshAccessToken(){
  var self = this;
  return new Promise(function(resolve, reject){
    self.OAuth2Client.refreshAccessToken(function(err, tokens){
      if(err){
        //do something with the error
        console.log(err);
        return reject('error in authenticating YouTube oAuth client.');
      }
      resolve(tokens);
    });
  });
};

Написанный нами метод initialize будет делать одно из двух в зависимости от того, какой аргумент мы ему передаем:

  • Создайте объект OAuth2Client как свойство в экземпляре класса youTubeAPISservice, который мы создадим, используя идентификатор клиента и секретные значения клиента, полученные нами ранее из консоли разработчика Google в дополнение к URL-адресу перенаправления.
  • Создайте клиентский объект youtube на экземпляре этого класса. Нам нужно сделать это после запуска инициализации с аргументом «Client», поскольку для создания экземпляра объекта youtube требуется свойство OAuth2Client службы.

Для маркера 1 значение URL-адреса перенаправления может быть любым, что вы хотите, поскольку при перенаправлении вы найдете строку, добавленную к URL-адресу в качестве параметра запроса, и эта строка - то, что нас действительно волнует, когда дело доходит до получения токена обновления.

Также обратите внимание на второй метод выше: refreshAccessToken. При передаче аргумента «Tokens» метод инициализации нашего класса использует этот метод, чтобы использовать токен обновления для получения токена доступа и установки его в качестве учетных данных в свойстве OAuth2Client класса. (Обратите внимание, что после получения токенов в обратном вызове self.OAuth2Client.refreshAccessToken нам не нужно повторно вызывать OAuth2Client.setCredentials с только что полученным токеном доступа - об этом позаботится метод refreshAccessToken).

Наконец, добавьте в свой класс YouTubeAPIService третий метод под названием generateAuthURL и экспортируйте содержимое модуля как конструктор объекта:

YouTubeAPIService.prototype.generateAuthURL = function generateAuthURL(){
  var self = this;
  var url = self.OAuth2Client.generateAuthURL({
    access_type: 'offline',
    scope: 'https://gdata.youtube.com'
  });
  return url;
};
module.exports = YouTubeAPIService;

Это то, что мы будем использовать для создания экрана авторизации.

Теперь потребуйте, чтобы служба API YouTube, которую вы написали в другом модуле, использовала ее и создала экземпляр службы:

'use strict';
var YouTubeAPIService = require('./youtubeapiservice');
var youTubeAPIService = new YouTubeAPIService();
youTubeAPIService.initialize('Client');
console.log(youTubeAPIService.generateAuthURL());

Инициализируйте службу с аргументом «Клиент», а затем вызовите метод generateAuthURL. При запуске обязательно передайте все необходимые переменные среды. Вот пример того, как это может выглядеть:

CLIENT_ID=20816xxx9000-01915787998v7kasqh2g8nmxxxbe20ni.apps.googleusercontent.com CLIENT_SECRET=HXeD1isebxxxxxg7I405y2L REDIRECT_URL=http://www.google.com node sampleusage.js

Вы должны получить URL-адрес экрана согласия, записанный в консоль. Давайте посетим этот URL.

Нажмите «Разрешить», и вы будете перенаправлены на URL, который вы передали в качестве переменной среды REDIRECT_URL, с параметром запроса, который называется «код», добавленным к строке URL. Скопируйте это значение и сохраните его.

Теперь давайте изменим наш класс YouTubeAPIService и четвертый метод под названием getToken на наш прототип:

YouTubeAPIService.prototype.getToken = function getToken(code){
  var self = this;
  self.OAuth2Client.getToken(code, function(err, tokens){
    console.log(tokens);
  });
};
module.exports = YouTubeAPIService;

Вы также захотите изменить свой второй модуль для вызова метода getToken после запроса и инициализации экземпляра youTubeAPIService:

'use strict';
var YouTubeAPIService = require('./youtubeapiservice');
var youTubeAPIService = new YouTubeAPIService();
youTubeAPIService.initialize('Client');
youTubeAPIService.getToken();

Когда вы снова запустите этот второй модуль с теми же значениями для CLIENT_ID, CLIENT_SECRET и REDIRECT_URL, он запишет в консоль объект, который должен содержать свойство с именем refresh_token. Сохраните это значение.

Теперь давайте перепишем наш второй модуль так, чтобы он запускал метод .initialize () дважды - один раз с аргументом «Client» для создания свойства OAuth2Client службы и еще раз с аргументом «Tokens» для создания объекта API YouTube:

'use strict';
var YouTubeAPIService = require('./youtubeapiservice');
var youTubeAPIService = new YouTubeAPIService();
youTubeAPIService.initialize('Client');
youTubeAPIService.initialize('Tokens');

Когда мы запустим этот модуль сейчас, мы обязательно передадим дополнительную переменную среды - REFRESH_TOKEN - с использованием значения, созданного вами выше с помощью метода getToken ().

Вот и все! В блоке .then () второго вызова инициализации вы можете начать использовать объект API YouTube, который теперь полностью аутентифицирован, для запроса API данных YouTube. Два служебных метода, которые мы добавили в прототип (generateAuthURL и getToken), нужно использовать только один раз, поскольку срок действия генерируемого нами токена обновления никогда не истекает. Метод refreshAccessToken также можно использовать вне контекста initalize () всякий раз, когда мы хотим обновить токен.

Вот пример того, как вы можете использовать полностью аутентифицированный объект youTubeAPI для доступа к данным из частного плейлиста, связанного с вашей учетной записью Google:

'use strict';
var YouTubeAPIService = require('./youtubeapiservice');
var youTubeAPIService = new YouTubeAPIService();
youTubeAPIService.initialize('Client');
youTubeAPIService.initialize('Tokens')
  .then(function(){
    youTubeAPIService.youtube.playlistItems.list({
      playlistId : 'dpYFG4qwrvU&list=RDdpYFG4qwrvU',
      part : 'snippet',
      maxResults: '50'
    }, function(err, data){
      if(err){
        console.log(err);
        //do something to handle the error
        return err;
      }
      if(data){
        console.log(data);
        return data;
      }
    });
  });

Развлекайся!