Аутентификация YouTube в узле JS не работает на Hasura
Я использовал документы YouTube для реализации метода поиска в API данных YouTube и googleapis.com/auth/youtube для проверки подлинности.
По этим ссылкам:
Документация по быстрому запуску API данных Youtube
Google официально поддерживает клиентскую библиотеку Node.js для доступа к API Google
- Я создал новый проект в консоли разработчиков Google
- Добавлены учетные данные OAuth
- Скачал мой файл "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);
});