Аутентификация YouTube в узле JS не работает на Hasura

Я использовал документы YouTube для реализации метода поиска в API данных YouTube и googleapis.com/auth/youtube для проверки подлинности.

По этим ссылкам:
Документация по быстрому запуску API данных Youtube
Google официально поддерживает клиентскую библиотеку Node.js для доступа к API Google

  1. Я создал новый проект в консоли разработчиков Google
  2. Добавлены учетные данные OAuth
  3. Скачал мой файл "client_secret.json"

Функция проверки подлинности в приведенном ниже коде не выполняется при развертывании на Hasura, хотя она отлично работает на локальном хосте

Это дает ошибку, как показано ниже

(узел:1) UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 1): ошибка: завершено с кодом 3 (узел:1) DeprecationWarning: необработанное отклонение обещания не рекомендуется. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

мой код app.js

    const google = require('googleapis');
    const sampleClient = require('./sampleclient');
    const youtube = google.youtube({
      version: 'v3',
      auth: sampleClient.oAuth2Client
    });

    const scopes = ['https://www.googleapis.com/auth/youtube'];

    sampleClient.authenticate(scopes, err => {
      if (err) {
        console.log('in app if err');  
         return res.json({
        'output': {
            'text': 'Error authenticating youtube api.  '
          }
        })
      }
    });

    // Endpoint to be call from the client side
    app.post('/api/playlist', function(req, res) {

    youtube.search.list({
            part: 'id,snippet',
            q: req.body.q || {},
            maxResults: '10'      
          }, (err, data) => {
              if (err) {
                    return res.status(err.code||400).json(err);
                 //return err;
                    }
            return res.json(data);
            //  return ();
            });

    });

SampleClient code
--------------------------

        class SampleClient {
          constructor (options) {
            this._options = options || { scopes: [] };

            // create an oAuth client to authorize the API call
            this.oAuth2Client = new OAuth2Client(
              keys.client_id,
              keys.client_secret,
              keys.redirect_uris[0]                                    --- works fine with localhost:3000  but on live its replaced with http://... 
            );

            google.options({
            auth: this.oAuth2Client
            });

          }

          // Open an http server to accept the oauth callback. In this
          // simple example, the only request to our webserver is to
          // /callback?code=<code>
        authenticate (scopes, callback) {
            // grab the url that will be used for authorization
            console.log('in authe');
            this.authorizeUrl = this.oAuth2Client.generateAuthUrl({
              access_type: 'offline',
              scope: scopes.join(' ')
            });
            console.log('after auth');
            const server = http.createServer((req, res) => {
              console.log('creating server') ;

              if (req.url.indexOf('/oauth2callback') > -1) {
                const qs = querystring.parse(url.parse(req.url).query);
                this.oAuth2Client.getToken(qs.code, (err, tokens) => {
                  if (err) {
                    console.error('Error getting oAuth tokens: ' + err);
                    return callback(err);
                  }
                  this.oAuth2Client.credentials = tokens;
                  res.end('Authentication successful! Please return to the console.');
              console.log('authe sucess');
                  callback(null, this.oAuth2Client);
                  server.close();
                });
              }
            }).on("error", err=>console.log('error cap', err.stack));
              server.listen(3000, () => {
              // open the browser to the authorize url to start the workflow
              opn(this.authorizeUrl);
                    })

          }
        }
    module.exports = new SampleClient();

server.js

'use strict';

require('dotenv').config({silent: true});

var server = require('./app');
var port = process.env.PORT || process.env.VCAP_APP_PORT || 5000;

server.listen(port, function() {
  // eslint-disable-next-line
  console.log('Server running on port: %d', port);
});

0 ответов

Другие вопросы по тегам