首页 > 解决方案 > Twilio 验证不起作用,它一直返回 undefined

问题描述

我正在使用 React Native 我一遍又一遍地停留在同一个问题上。

此代码使用 axios。我不知道为什么它一直返回未定义。我正确地写了我所有的 twilio id。

我使用了无服务器 twilio,它可以工作,但我不知道如何以我的方式改变它。如果我不能再使用此代码,请告诉我是否有其他好方法。我不知道如何使用 node.js。我会很感激你的帮助。

这是代码。

获取.js

'use strict';

Object.defineProperty(exports, '__esModule', {
  value: true,
});
exports.default = void 0;

var _querystring = _interopRequireDefault(require('querystring'));

var _axios = _interopRequireDefault(require('axios'));

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {default: obj};
}

class Fetch {
  constructor({twilioServiceSid, twilioAccountSid, twilioAuthToken}) {
    const fetch = _axios.default.create({
      baseURL: `https://verify.twilio.com/v2/Services/${twilioServiceSid}`,
      auth: {
        username: twilioAccountSid,
        password: twilioAuthToken,
      },
    });

    this.fetch = fetch;
  }

  async post({path, payload}) {
    try {
      const obj = {
        To: payload.phone,
        Channel: 'sms',
      };

      if ('code' in payload) {
        obj['Code'] = payload.code;
      }

      const {status, data} = await this.fetch.request({
        method: 'POST',
        url: path,
        data: _querystring.default.stringify(obj),
      });
      return {
        status,
        data,
      };
    } catch (error) {
      return error;
    }
  }
}

exports.default = Fetch;

验证.js

'use strict';

Object.defineProperty(exports, '__esModule', {
  value: true,
});
exports.default = void 0;

var _phone = _interopRequireDefault(require('phone'));

var _fetch = _interopRequireDefault(require('./fetch'));

function _interopRequireDefault(obj) {
  return obj && obj.__esModule ? obj : {default: obj};
}

class Serify {
  constructor({twilioServiceSid, twilioAccountSid, twilioAuthToken}) {
    this.fetch = new _fetch.default({
      twilioServiceSid,
      twilioAccountSid,
      twilioAuthToken,
    });
    this.twilioAccountSid = twilioAccountSid;
    this.twilioAuthToken = twilioAuthToken;
  }

  async start({phone, country}) {
    try {
      const number = (0, _phone.default)(phone, country ? country : 'USA');

      if (!number) {
        throw new Error(
          'Invalid phone number. Please provide the country code in an ISO-3166 alpha 3 format.',
        );
      }

      const response = await this.fetch.post({
        path: 'Verifications',
        payload: {
          phone: number,
        },
      });
      return {
        code: response.status,
        data: response.data,
      };
    } catch (error) {
      return new Error(error);
    }
  }

  async verify({phone, country, code}) {
    try {
      const number = (0, _phone.default)(phone, country ? country : 'USA');

      if (!number) {
        throw new Error(
          'Invalid phone number. Please provide the country code in an ISO-3166 alpha 3 format.',
        );
      }

      if (code.length <= 3) {
        throw new Error('Invalid SMS code.');
      }

      const response = await this.fetch.post({
        path: 'VerificationCheck',
        payload: {
          phone: number,
          code: code.toString(),
        },
      });
      return {
        code: response.status,
        data: response.data,
      };
    } catch (error) {
      return new Error(error);
    }
  }
}

exports.default = Serify;

  const verify = new Serify({
    twilioServiceSid: '', 
    twilioAccountSid: '', 
    twilioAuthToken: '', 
  });
    try {
      const ss = await verify.start({
        phone: '+1456123123',
      });
      console.log(ss);
    } catch (e) {
      console.log(e);
    }

标签: javascriptreact-nativetwilio

解决方案


Twilio 开发人员布道者在这里。

我不确定你说的哪个部分返回未定义。但是,这里有一个更大的问题。

构建本机应用程序时,您无法将 Twilio 凭据嵌入应用程序中,也无法从应用程序直接向 Twilio 发出 API 请求。恶意用户可以反编译应用程序、提取您的帐户凭据并滥用您的 Twilio 帐户。

您不应该从您的应用程序发出 API 请求。相反,您应该构建一个服务器端代理来存储您的 Twilio 凭据并发出您从应用程序触发的 API 请求。

我没有 Twilio 验证和 React Native 的示例,但理论与从 React 应用程序发送 SMS相同。

如果您已经设法使用 Twilio Serverless 实现了这一点,那么您应该回到那个版本。如果您对此有疑问,我会问一个新问题。


推荐阅读