Попытка запустить authy-client с помощью Firebase Cloud Functions

Я пытался заставить authy-client работать с облачными функциями Firebase, но продолжаю сталкиваться с ValidationFailedError. Я тестировал примеры, предоставленные автором на https://www.npmjs.com/package/authy-client не повезло.

Для моей функции Firebase я пробовал это:

const Client = require('authy-client').Client;
const client = new Client({ key: 'my API key here' });

exports.sendVerificationCode = functions.database.ref('users/{userId}/verify/status')
.onCreate(event => {
  const sender = client.registerUser({
    countryCode: 'US',
    email: '[email protected]',
    phone: '4035555555'
  }).then( response => {
    return response.user.id;
  }).then( authyId => {
    return client.requestSms({ authyId: authyId });
  }).then( response => {
    console.log(`SMS requested to ${response.cellphone}`);
    throw Promise;
  });

  return Promise.all([sender]);
});

Но я получаю такую ​​ошибку:

ValidationFailedError: Validation Failed
    at validate (/user_code/node_modules/authy-client/dist/src/validator.js:74:11)
    at _bluebird2.default.try (/user_code/node_modules/authy-client/dist/src/client.js:632:31)
    at tryCatcher (/user_code/node_modules/authy-client/node_modules/bluebird/js/release/util.js:16:23)
    at Function.Promise.attempt.Promise.try (/user_code/node_modules/authy-client/node_modules/bluebird/js/release/method.js:39:29)
    at Client.registerUser (/user_code/node_modules/authy-client/dist/src/client.js:617:34)
    at exports.sendVerificationCode.functions.database.ref.onCreate.event (/user_code/index.js:24:25)
    at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:59:27)
    at next (native)
    at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
    at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
    at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:53:36)
    at /var/tmp/worker/worker.js:695:26
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

Я новичок в облачных функциях Firebase, поэтому я могу упустить что-то очевидное, но из того, что я прочитал, операторы then () и сама функция должны возвращать / бросать Promise, поэтому я взломал это вместе.

Я также убедился, что authy-client включен в зависимости в файле package.json.

Изначально я подписался на пробную версию Twilio, которая дала мне возможность создать приложение с Authy. Чтобы быть уверенным, я также вошел в Authy, чтобы проверить, совпадают ли ключи API и они. Поэтому я не думаю, что ошибка проверки связана с ключом API.

Любая помощь будет оценена. Спасибо.


person Freakium    schedule 31.01.2018    source источник


Ответы (3)


Спасибо всем за ответы. Наконец-то я нашел решение. Это не имело ничего общего с кодом, ну, throw Promise было ошибкой, но, очевидно, это была проблема с разрешениями DNS, которая была решена, когда я настроил биллинг на Firebase.

Что касается моего последнего кода, поскольку я изначально хотел использовать authy-client для проверки по телефону, он выглядит примерно так:

exports.sendVerificationCode = functions.database.ref('users/{userId}/verify')
.onCreate(event => {
  const status = event.data.child('status').val();
  const phoneNum = event.data.child('phone').val();
  const countryCode = event.data.child('countryCode').val();
  var method;

  if(status === 'pendingSMS')
    method = 'sms';
  else
    method = 'call';

  // send code to phone
  const sender = authy.startPhoneVerification({ countryCode: countryCode, phone: phoneNum, via: method })
  .then( response => {
    return response;
  }).catch( error => {
    throw error;
  });

  return Promise.all([sender]);
});
person Freakium    schedule 07.02.2018

throw Promise на самом деле ничего не значит. Если вы хотите зафиксировать проблемы, которые могут возникнуть где угодно в вашей последовательности обещаний, у вас должен быть раздел отлова. Общая форма такова:

return someAsyncFunction()
    .then(...)
    .then(...)
    .catch(error => { console.error(error) })

Однако это не обязательно исправит вашу ошибку. Это могло быть из вызванного вами API.

person Doug Stevenson    schedule 31.01.2018

Проповедник разработчиков Twilio здесь.

Дуг прав насчет throw Promise, это обязательно нужно изменить.

Однако ошибка, похоже, исходит до этого и от API. В частности, трассировка стека сообщает нам:

    at Client.registerUser (/user_code/node_modules/authy-client/dist/src/client.js:617:34)

Итак, проблема в функции registerUser. Лучше всего попытаться раскрыть больше ошибок, генерируемых API. Это должно дать вам необходимую информацию.

Что-то вроде этого должно помочь:

const Client = require('authy-client').Client;
const client = new Client({ key: 'my API key here' });

exports.sendVerificationCode = functions.database.ref('users/{userId}/verify/status')
.onCreate(event => {
  const sender = client.registerUser({
    countryCode: 'US',
    email: '[email protected]',
    phone: '4035555555'
  }).then( response => {
    return response.user.id;
  }).then( authyId => {
    return client.requestSms({ authyId: authyId });
  }).then( response => {
    console.log(`SMS requested to ${response.cellphone}`);
  }).catch( error => {
    console.error(error.code);
    console.error(error.message);
    throw error;
  });    
});

Сообщите мне, если это поможет.

person philnash    schedule 06.02.2018
comment
Спасибо за помощь. Я наконец смог найти решение, и проблема была на моей стороне. Разрешения DNS из ресурсов, не принадлежащих Google, по-видимому, не разрешены, пока биллинг не настроен на Firebase. - person Freakium; 08.02.2018