【问题标题】:Cloud function to reset users password isn't working重置用户密码的云功能不起作用
【发布时间】:2021-03-24 00:24:48
【问题描述】:

我正在开发一个 Web 应用程序,该应用程序的部分功能是具有管理员登录权限并能够重置用户密码。我正在使用 Firebase 云功能。

resetForm.addEventListener('submit', (e) => {
        console.log("Step 1");
        e.preventDefault();
        let newPass = resetForm['reset-password'].value;
        const resetPasswordFunction = firebase.functions().httpsCallable('resetPassword');
        resetPasswordFunction(docId,newPass).then(() => {
            const modal = document.querySelector('#modal-reset');
          M.Modal.getInstance(modal).close();
          resetForm.reset();
        })
        console.log("Step 1.5");
    });

.

var functions = require('firebase-functions');
var admin = require("firebase-admin");
var serviceAccount = require("./troop-30-elections-web-app-firebase-adminsdk-obsmr-6913a9dca3.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://troop-30-elections-web-app.firebaseio.com"
});

exports.resetPassword = functions.https.onCall((docId,newPass) => {
    console.log("step 2");
    admin.auth().updateUser(docId, {
        password: newPass,
    });
});

我通过填写表格对其进行了测试,但没有任何反应。我查看了控制台,没有错误,但是我看到了第 1 步和第 1.5 步。

【问题讨论】:

标签: javascript firebase firebase-authentication google-cloud-functions firebase-admin


【解决方案1】:

我做了更多的研究并编辑了我的代码。这有效:

resetForm.addEventListener('submit', (e) => {
        console.log("Step 1");
        e.preventDefault();
        let newPass = resetForm['reset-password'].value;
        const resetPasswordFunction = firebase.functions().httpsCallable('resetPassword');
        resetPasswordFunction({docId: docId, newPass: newPass}).then(() => {
            const modal = document.querySelector('#modal-reset');
          M.Modal.getInstance(modal).close();
          resetForm.reset();
        });
        console.log("Step 1.5");
    });

.

var functions = require('firebase-functions');
var admin = require("firebase-admin");
var serviceAccount = require("./troop-30-elections-web-app-firebase-adminsdk-obsmr-6913a9dca3.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://troop-30-elections-web-app.firebaseio.com"
});

exports.resetPassword = functions.https.onCall((data) => {
  return admin.auth().updateUser(data.docId, { 
    password: data.newPass
   })
  .then(() => {
      return {"text": "User Password Successfully Updated"};  // this is what gets sent back to the app
  });
});

【讨论】:

    【解决方案2】:

    对于可调用类型函数,您必须返回一个承诺,该承诺会产生对象的值,以发送回调用它的客户端应用程序。该承诺必须仅在所有异步工作完成后才解决,否则该函数将在工作完成之前关闭。

    现在,您的函数没有返回任何内容,并且忽略了 updateUser() 返回的承诺。 Cloud Functions 在工作完成之前终止函数:promise 被忽略。您的代码应改为使用该承诺并将结果发送回客户端。这将发送一个空对象,但您可以在其中做任何您想做的事情:

        return admin.auth().updateUser(docId, { password: newPass })
        .then(() => {
            return {};  // this is what gets sent back to the app
        });
    

    【讨论】:

    • 谢谢。我可以把它留空,还是我需要在里面放点东西?如果是,那是什么?
    • 您希望客户端应用接收什么?把它放在那里。它可以是任何表示为 JSON 的东西。
    • 我认为它不需要接收任何东西。它只需要更新用户密码。
    • 然后发送您想要的任何内容。你无法避免发送一些东西。总会有回应的。
    • 我添加了以下内容:{"text": "User Password Successfully Updated"} 我通过填写表单对其进行了测试,但出现以下错误:Uncaught (in promise) Error: INTERNAL跨度>
    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    相关资源
    最近更新 更多