Flutter 调用 firebase 云函数 admin.auth.updateUser
Flutter calling firebase cloud function admin.auth.updateUser
编辑**
好的,由于提供的第一个答案,我能够使参数正常工作,但现在我遇到了一个问题,即我的函数完全在 Firebase 中创建一个新用户,而不是更新现有用户,即我传递的 uid auth.admin.updateUser 是我要更新电子邮件的现有用户的 uid。这是更新的云功能,它正在添加新用户而不是更新现有用户:
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 文档中获得了该功能,但它没有按照我的预期进行。
原版POST**
我在从我的 flutter 代码中调用云函数时遇到了一些困难。我遇到的问题是 uid 和 email 字段未定义,即使我使用 busboy 字段将它们传递给云函数。
我正在尝试将电子邮件和 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 字段一起传递,它们也没有在函数中设置,是不是我做错了什么?
你为什么不使用 callable function?它将自动接收身份验证数据。
文档甚至有关于如何获取 uid 和电子邮件的示例:
声明函数:
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"});
任何参数都将传递给函数端的数据参数。
编辑**
好的,由于提供的第一个答案,我能够使参数正常工作,但现在我遇到了一个问题,即我的函数完全在 Firebase 中创建一个新用户,而不是更新现有用户,即我传递的 uid auth.admin.updateUser 是我要更新电子邮件的现有用户的 uid。这是更新的云功能,它正在添加新用户而不是更新现有用户:
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 文档中获得了该功能,但它没有按照我的预期进行。
原版POST**
我在从我的 flutter 代码中调用云函数时遇到了一些困难。我遇到的问题是 uid 和 email 字段未定义,即使我使用 busboy 字段将它们传递给云函数。
我正在尝试将电子邮件和 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 字段一起传递,它们也没有在函数中设置,是不是我做错了什么?
你为什么不使用 callable function?它将自动接收身份验证数据。
文档甚至有关于如何获取 uid 和电子邮件的示例:
声明函数:
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"});
任何参数都将传递给函数端的数据参数。