我一直在尝试在flutter中使用自定义UID在firebase中创建一个新用户,但似乎只能使用FireBaseAdmin包来完成,而且在flutter中还没有实现。有没有可能的方法可以使用自定义UID创建一个新用户?我没有原生开发的背景,所以目前我不可能用原生java或Kotlin实现admin方法。有人知道如何实现吗?
jucafojl1#
用户的UID由创建用户的身份验证提供程序确定。当调用客户端Firebase SDK中的现有提供程序(如FlutterFire库)时,无法指定自己的UID。如果为用户指定自己的UID是一个硬性要求,您可以implement a custom provider。这 * 确实 * 涉及到将代码写入create a custom ID token,该代码在可信环境(例如您的开发机器,您控制的服务器或Cloud Functions)中运行。或者,您也可以考虑存储从Firebase提供的UID到您想要用来引用同一用户的ID的Map。这是一个经常用于给予用户唯一名称的场景,所以我建议检查questions related to unique user names。
nwsw7zdq2#
我是这样做的。我使用firebase云函数和pub.dev的普通firebase auth包。在应用程序中,在登录时,我通过http触发器firebase函数和http包(也可以在pub.dev上获得)将用户的电子邮件地址和uid提交给服务器。
Future<String?> createAccountWithSpecificUserID(String? email,String? userName,String? password,String uid,String? phone,) async { final response = await http.post( Uri.parse( '${cloudFunctionStart}createFirebaseUser', ), headers: {'Content-Type': 'application/json'}, body: jsonEncode( { if (email != null) 'email': email, if (userName != null) "username": userName, if (password != null) 'password': password, 'uid': uid, if (phone != null) "phone": phone, }, ), ); if (response.statusCode == 200) { return null; } else { return response.body; } }
Future<String?> createAccountWithSpecificUserID(
String? email,
String? userName,
String? password,
String uid,
String? phone,
) async {
final response = await http.post(
Uri.parse(
'${cloudFunctionStart}createFirebaseUser',
),
headers: {'Content-Type': 'application/json'},
body: jsonEncode(
{
if (email != null) 'email': email,
if (userName != null) "username": userName,
if (password != null) 'password': password,
'uid': uid,
if (phone != null) "phone": phone,
},
);
if (response.statusCode == 200) {
return null;
} else {
return response.body;
}
字符串这个函数将数据发送到云函数,云函数的代码如下所示(它是 typescript 。请根据需要自由使用):
export const createFirebaseUser = functions.https.onRequest(async (req, res) => { corsMiddleware(req, res, async () => { try { const email = req.body.email; const password = req.body.password; const name = req.body.name; const uid = req.body.uid; const userRecord = await admin.auth().createUser({ email: email, displayName: name, uid: uid, emailVerified: false, password: password, disabled: false, }); res.status(200).send(`User created with email: ${userRecord.email}`); } catch (error) { res.status(500).send(`Error creating user: ${error}`); logToConsole("Error creating user", error!.toString(), error); } });});
export const createFirebaseUser = functions.https.onRequest(async (req, res) => {
corsMiddleware(req, res, async () => {
try {
const email = req.body.email;
const password = req.body.password;
const name = req.body.name;
const uid = req.body.uid;
const userRecord = await admin.auth().createUser({
email: email,
displayName: name,
uid: uid,
emailVerified: false,
password: password,
disabled: false,
});
res.status(200).send(`User created with email: ${userRecord.email}`);
} catch (error) {
res.status(500).send(`Error creating user: ${error}`);
logToConsole("Error creating user", error!.toString(), error);
型这个函数返回一个可以为空的字符串。如果字符串为空,那么我们很好。登录。如果不是,那么有一个错误,字符串是错误消息。下面是一个代码示例
setState(() { processing = true; nameController = TextEditingController( text: accts[0].name, ); processingText = translation(context)!.creatingAccount; }); if (nameController.text.trim().isEmpty) { nameController = TextEditingController( text: accts[0].name, ); } String? cc = await createAccountWithSpecificUserID( emailController.text.trim().toLowerCase(), nameController.text.trim(), passwordController.text.trim(), accts[0].id, null, ); if (cc == null) { signIn(); } else { setState(() { processing = false; }); showDialog( context: context, builder: (context) { return CustomDialogBox( bodyText: "$cc.\n\n${translation(context)!.ifYouNeedHelp}", buttonText: translation(context)!.pressHereToCallUs, onButtonTap: () { context.pushNamed( RouteConstants.contactUs, ); }, showButton: true, ); }, ); }
setState(() {
processing = true;
nameController = TextEditingController(
text: accts[0].name,
processingText = translation(context)!.creatingAccount;
if (nameController.text.trim().isEmpty) {
String? cc = await createAccountWithSpecificUserID(
emailController.text.trim().toLowerCase(),
nameController.text.trim(),
passwordController.text.trim(),
accts[0].id,
null,
if (cc == null) {
signIn();
processing = false;
showDialog(
context: context,
builder: (context) {
return CustomDialogBox(
bodyText:
"$cc.\n\n${translation(context)!.ifYouNeedHelp}",
buttonText: translation(context)!.pressHereToCallUs,
onButtonTap: () {
context.pushNamed(
RouteConstants.contactUs,
showButton: true,
型我希望这能帮上忙。哦,还有,那个translation(context). blah blah的东西只是我翻译的字符串。我不得不在代码中添加本地化,因为这个应用程序是由说不同语言的人使用的。
translation(context). blah blah
lokaqttq3#
您可以使用FirebaseAuthentication。当一个用户创建一个帐户时,它将创建一个具有随机UID的新用户,该UID将是唯一的。链接:https://firebase.flutter.dev/docs/auth/usage/它非常容易用途:
3条答案
按热度按时间jucafojl1#
用户的UID由创建用户的身份验证提供程序确定。当调用客户端Firebase SDK中的现有提供程序(如FlutterFire库)时,无法指定自己的UID。
如果为用户指定自己的UID是一个硬性要求,您可以implement a custom provider。这 * 确实 * 涉及到将代码写入create a custom ID token,该代码在可信环境(例如您的开发机器,您控制的服务器或Cloud Functions)中运行。
或者,您也可以考虑存储从Firebase提供的UID到您想要用来引用同一用户的ID的Map。这是一个经常用于给予用户唯一名称的场景,所以我建议检查questions related to unique user names。
nwsw7zdq2#
我是这样做的。我使用firebase云函数和pub.dev的普通firebase auth包。
在应用程序中,在登录时,我通过http触发器firebase函数和http包(也可以在pub.dev上获得)将用户的电子邮件地址和uid提交给服务器。
字符串
这个函数将数据发送到云函数,云函数的代码如下所示(它是 typescript 。请根据需要自由使用):
型
这个函数返回一个可以为空的字符串。如果字符串为空,那么我们很好。登录。如果不是,那么有一个错误,字符串是错误消息。下面是一个代码示例
型
我希望这能帮上忙。哦,还有,那个
translation(context). blah blah
的东西只是我翻译的字符串。我不得不在代码中添加本地化,因为这个应用程序是由说不同语言的人使用的。lokaqttq3#
您可以使用FirebaseAuthentication。
当一个用户创建一个帐户时,它将创建一个具有随机UID的新用户,该UID将是唯一的。
链接:https://firebase.flutter.dev/docs/auth/usage/
它非常容易用途: