Firebase Cloud Функции для отправки HTTP-запроса на пользовательский триггер входа?

Извините, но я посмотрел все семь видео Дженнифер Персон, прочитал документацию и проработал учебники, но я до сих пор не понимаю, как написать свою функцию. Я пытаюсь написать функцию, которая получает токен текста IBM Watson, который получается с помощью этого сценария CURL:

curl -X GET --user username:password --output token
"https://stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api"

То есть, отправьте HTTP-запрос GET на URL, укажите мое имя пользователя и пароль, а затем запишите результат в файл. /javascript/services/token,

Это мое предположение относительно функции. Триггер аутентификации оборачивает HTTP-запрос Nodejs GET и сохраняет файл NodeJs fs.writefile,

const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.getWatsonToken = functions.auth.user().onCreate(event => { // authentication trigger

  var https = require('https');  // Nodejs http.request

  var options = {
    host: 'stream.watsonplatform.net',
    path: '/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api',
    username: groucho,
    password: swordfish
  };

  callback = function(response) {
    response.on('end', function () {
      console.log(response);
      fs.writeFile("/javascript/services/token", response);
    });
  }

  http.request(options, callback).end();

});

1 ответ

Эта функция работает:

// Node modules
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests
const fs = require('fs');

admin.initializeApp(functions.config().firebase);

exports.getWatsonToken = functions.database.ref('userLoginEvent').onUpdate(event => { // authentication trigger when user logs in

  var username = 'groucho',
      password = 'swordfish',
      url = 'https://' + username + ':' + password + '@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api';

  request({url: url}, function (error, response, body) {

    var tokenService = "app.value('watsonToken','" + body + "');";

    fs.writeFile('../public/javascript/services/watsonTokenValue.js', tokenService, (err) => {
      if (err) throw err;
        console.log('The file has been saved!');
    }); // close fs.writeFile

  }); // close request

}); // close getWatsonToken

В контроллере:

 firebase.auth().onAuthStateChanged(function(user) { // this runs on login
    if (user) { // user is signed in
      console.log("User signed in!");
      $scope.authData = user;
      firebase.database().ref('userLoginEvent').update({'user': user.uid}); // update Firebase database to trigger Cloud Function to get a new IBM Watson token
    } // end if user is signed in
    else { // User is signed out
      console.log("User signed out.");
    }
  }); // end onAuthStateChanged

Проходя через облачную функцию, он внедряет четыре Node-модуля, включая request для отправки HTTP-запросов, и fs для записи результатов в файл. Затем устанавливается триггер для обновления местоположения userLoginEvent в базе данных Firebase (которую я создал из консоли). Далее HTTP-запрос уходит. Ответ (токен) называется body.app.value('watsonToken','" + body + "'); Служба угловых значений для переноса токена затем fs пишет все это в место в моем проекте.

В контроллере AngularJS, onAuthStateChanged срабатывает, когда пользователь входит в систему. Затем user.uid обновляется до местоположения userLoginEvent в базе данных Firebase и триггерах Cloud Function HTTP-запрос отправляется, а ответ записывается в службу Angular.

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