我正在尝试取消电子邮件与已链接到电话号码和电子邮件的当前用户的链接。
这里我做什么:
admin.auth().updateUser("user uid", {
email: null,
password: null,
})
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully updated user', userRecord.toJSON());
})
.catch(function(error) {
console.log('Error removing email:', error);
});
但是它返回错误
The email address is improperly formatted.
出于某种原因,只有当我删除电子邮件时才会发生这种情况,当我对电话执行相同操作时:
admin.auth().updateUser("user uid", {
phoneNumber: null,
})
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log('Successfully updated user', userRecord.toJSON());
})
.catch(function(error) {
console.log('Error removing phone number:', error);
});
以上代码有效,手机完美移除。但只有当我对电子邮件执行此操作时才会发生错误。
有什么我想念的吗?
UpdateRequest#email
必须是undefined
或有效的电子邮件。因为您传入null
,这就是您收到“电子邮件地址格式不正确”错误消息的原因。
UpdateRequest#password
必须是 undefined
或未经哈希处理的密码 - 这也会引发类似的错误。
为了防止用户使用他们的电子邮件和密码登录,您需要在 server 或客户端(legacy,modern)上取消链接他们的凭据:
// admin SDK
admin.auth().updateUser("user uid", {
providersToUnlink: [ admin.auth.EmailAuthProvider.PROVIDER_ID ]
})
// legacy client SDK
firebase.auth().currentUser
.unlink(firebase.auth.EmailAuthProvider.PROVIDER_ID);
// modern client SDK
unlink(getAuth().currentUser, EmailAuthProvider.PROVIDER_ID);
注意: 即使这会阻止用户使用电子邮件密码组合登录,它也不会从他们的个人资料中删除用户的电子邮件。如果您使用链接任何使用同一电子邮件的帐户的设置,这有助于防止用户在其旧帐户仍然存在时创建新帐户。
如果你现在想从他们的个人资料中删除用户的电子邮件地址,因为他们不能使用它,不幸的是你不能通过将其设置为
null
来删除与帐户关联的电子邮件。相反,你需要掩盖它。
// admin SDK
const userId = "user uid";
admin.auth().updateUser(userId, {
email: `${userId}@noreply.users.yourapp.com`, // doesn't have to actually exist
emailVerified: true, // prevents sending verification emails
providersToUnlink: [ admin.auth.EmailAuthProvider.PROVIDER_ID ] // throws error if already unlinked
})
您可以使用 admin sdk 取消链接提供者使用 providersToUnlink
await auth.updateUser(user.uid, {
providersToUnlink: ['password'],
})