Трепетание, вызывающее функцию облака в firebase admin.auth.updateUser - PullRequest
0 голосов
/ 07 марта 2019

EDIT **

Хорошо, так что я смог заставить работать параметры благодаря предоставленному первому ответу, но теперь у меня есть проблема, из-за которой моя функция полностью создает нового пользователя в Firebase, а не обновляет существующего, uid, который я передаю в auth.admin.updateUser - это имя пользователя, чей адрес я хочу обновить. Вот обновленная облачная функция, которая добавляет нового пользователя вместо обновления существующего:

    exports.updateEmail = functions.https.onCall((data, context) => {

  const email = data.email;
  const uid = data.uid;

  admin.auth().updateUser(uid, {
              email: email
          })
          .then(function(userRecord) {
              // See the UserRecord reference doc for the contents of userRecord.
              console.log("Successfully updated user", userRecord.toJSON());
              return response.status(200).json(userRecord.toJSON());
          })
          .catch(function(error) {
              console.log("Error updating user:", error);
              return response.status(404).json({
                  error: 'Something went wrong.'
              });
          });
});

Я получил функцию из документации Firebase, но она не выполняет то, что я намеревался сделать.

ОРИГИНАЛЬНЫЙ ПОЧТА **

У меня возникли некоторые трудности при работе облачной функции при вызове функции из моего кода флаттера. У меня проблема в том, что поля uid и email не определены, хотя я передаю их в облачную функцию с помощью полей busboy.

Я пытаюсь передать поле email и uid функции следующим образом:

final request = http.MultipartRequest('POST', Uri.parse('****************my function url************'));

request.fields['email'] = Uri.encodeComponent(newEmail);
request.fields['uid'] = Uri.encodeComponent(selectedUser.uid);

request.headers['Authorization'] = 'Bearer ${_authenticatedUser.token}';

  final http.StreamedResponse streamedResponse = await request.send();

А на стороне Node.js я пытаюсь использовать эти поля с помощью busboy, вот моя облачная функция в Node.js:

exports.changeEmail = functions.https.onRequest((request, response) => {

if (!request.headers.authorization ||
    !request.headers.authorization.startsWith('Bearer ')
) {
    return response.status(401).json({
        error: 'Unauthorized.'
    });
}

let idToken;
idToken = request.headers.authorization.split('Bearer ')[1];
let email;
let uid;

const busboy = new Busboy({
    headers: request.headers
});

busboy.on('field', (fieldname, value) => {

    if (fieldname == 'email') {


        email = decodeURIComponent(value);
    }

    if (fieldname == 'uid') {

        uid = decodeURIComponent(value);
    }
});



admin.auth().updateUser(uid, {
        email: email
    })
    .then(function(userRecord) {
        // See the UserRecord reference doc for the contents of userRecord.
        console.log("Successfully updated user", userRecord.toJSON());
        return response.status(200).json(userRecord.toJSON());
    })
    .catch(function(error) {
        console.log("Error updating user:", error);
        return response.status(404).json({
            error: 'Something went wrong.'
        });
    });

});

Несмотря на то, что я передаю поля с полями busboy, они не устанавливаются в функции, есть ли что-то, что я делаю здесь неправильно?

1 Ответ

0 голосов
/ 07 марта 2019

Почему бы вам не использовать вызываемую функцию ?Он автоматически получит данные аутентификации.

В документации даже есть примеры того, как получить идентификатор пользователя и электронную почту:

Объявить функцию:

exports.addMessage = functions.https.onCall((data, context) => {
  // ...
});

Получить пользователясвойства из параметра контекста:

// Message text passed from the client.
const text = data.text;
// Authentication / user information is automatically added to the request.
const uid = context.auth.uid;
const name = context.auth.token.name || null;
const picture = context.auth.token.picture || null;
const email = context.auth.token.email || null;

Вызвать функцию из кода Flutter:

Установить cloud_functions пакет и затем:

import 'package:cloud_functions/cloud_functions.dart';

await CloudFunctions.instance.call(functionName: 'addMessage');

Если пользователь прошел аутентификацию перед вызовом функции, это все, что вам нужно сделать.

Вы также можете передать в функцию дополнительные параметры:

await CloudFunctions.instance.call(functionName: 'addMessage', parameters: {"email": "whatever@example.com"});

Любые параметры будут переданы параметру данных.на стороне функции.

...