асинхронная аутентификация с использованием API Google - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующий код:

async function initApi() {
  const googleKey = await readJSON(appRoot + '/secrets/google-auth.json');

  const jwt = new google.auth.JWT(
    googleKey.client_email, null, googleKey.private_key, scopes);

  return jwt.authorize();
}

const calendar = {
  events: events,

  api: google.calendar({
    version: 'v3',
    auth: this.jwt
  }),

  list: async function() {
    await this.api.calendarList.list();
  },
};

module.exports = async () => Object.assign(calendar, { jwt: await initApi() });

Я постоянно получаю сообщение «Требуется ошибка входа в систему».Тем не менее, jwt очень хорошо разрешает токен доступа, когда я регистрирую результат:

const Calendar = require('./above-code.js');

Calendar().then(c => console.log(c.jwt));
// { access_token: ... }

Calendar().then(c => console.log(c.list());
// Error: login required

Я не могу понять, почему.Это сводит меня с ума.Я хочу выбросить свой ноутбук из окна.

Что я делаю не так?Это лучший шаблон, использующий async и await с module.exports?Есть ли лучший способ просто вернуть объект, чтобы я мог вызвать Calendar.list() и получить результат без необходимости переходить через обручи, которые я сейчас делаю, чтобы просто получить API и вызвать методы напрямую?Например:

const Calendar = require('./above-code.js');
await Calendar.list();

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Сделал перерыв, прежде чем я вернулся к этому - лучшее решение для меня, кажется, становится менее разочарованным, прежде чем я продолжаю расстраивать проблему.

Во-первых, я переместил свойство api в initApi функция, и вернул это там - это, казалось, решило мой вопрос:

async function initApi() {
  const googleKey = await readJSON(appRoot + '/secrets/google-auth.json');

  const jwt = new google.auth.JWT(
    googleKey.client_email, null, googleKey.private_key, scopes);

  jwt.authorize();

  return google.calendar({
    version: 'v3',
    auth: jwt
  });
}

const calendar = {
  events: events,

  list: async function() {
    await this.api.calendarList.list();
  },
};

module.exports = async () => Object.assign(calendar, { api: await initApi() });

Однако второй оговоркой было то, что теперь он продолжал жаловаться на то, что client.request не был найден - оказывается, у Google есть два набораиз аутентичных инструментов.

После изменения на google-auth-library (вместо использования встроенного auth.JWT *1013*) я получил ответ от сервера без жалоб client.request:

const { google } = require('googleapis');
const { JWT } = require('google-auth-library');

...

async function initApi() {
  const googleKey = await readJSON(appRoot + '/secrets/google-auth.json');

  const jwt = new JWT(
    googleKey.client_email, null, googleKey.private_key, scopes);

  return await google.calendar({
    version: 'v3',
    auth: jwt
  });
}

Теперь это работает!Надеюсь, что это поможет всем, у кого есть эта проблема.

EDIT : Более того, см. Пример Google здесь для загрузки аутентификации из загружаемого файла JSON с панели инструментов API Google.

0 голосов
/ 11 февраля 2019

Вы добавляете jwt к объекту, а не как отдельную переменную, поэтому оно должно быть:

  google.calendar({
    version: 'v3',
    auth: this.jwt //here
}),

Object.assign(calendar, { jwt: 'value' }); это эквивалентно calendar.jwt = 'value'.И вы ссылаетесь, как если бы это было сделано следующим образом:

let jwt  = 'value';
  google.calendar({
    version: 'v3',
    auth: jwt //here
}),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...