firebase - 如果在点击链接后尝试返回移动应用程序,如何处理电子邮件验证?
问题描述
所需行为:当我在我的应用程序中按下“注册”按钮时,它会向指定的电子邮件发送一个验证链接,并导航到移动应用程序中的一个验证页面,该页面会提醒用户已发送验证电子邮件。然后用户可以转到自己的电子邮件并单击将验证用户的链接,然后将他们引导回验证页面,它将重新加载用户并将其发送到主页。
问题:我需要做什么才能处理这个问题?
我做过的事情:
我有一个自定义域,我们称之为
customdomain.com
. 我已经使用 firebase 托管进行了设置。我在 firebase 控制台中创建了一个名为的动态链接
customdomain.com/verify
我创建了 ActionCodeSettings 以传递给 sendEmailVerification() 函数:
String url = 'https://customdomain.com/verify/'; String androidPackage = 'com.example.customdomain'; String iosPackage = 'com.example.customdomain'; ActionCodeSettings actionCodeSettings = ActionCodeSettings(url: url, handleCodeInApp: true, android: {"packageName": androidPackage, "installApp": true, "minimumVersion": 21}, iOS: {"bundleId": iosPackage}, dynamicLinkDomain: 'https://customdomain.com/verify'); Future<void> verifyEmail(ActionCodeSettings actionCodeSettings) async { User userRegister = _auth.currentUser; if (!userRegister.emailVerified) { await userRegister.sendEmailVerification(actionCodeSettings); } }
我已经设置了我的 androidManifest.xml 和 build.gradle 来处理动态链接。
假设:
- 我可以在我的验证页面上使用 ValueNotifier 来监听 isEmailVerified 的变化。
- 我需要更改我的电子邮件模板以创建自定义电子邮件操作处理程序?(https://firebase.google.com/docs/auth/custom-email-handler?)
- 我不需要在 customdomain.com 上创建网页来处理电子邮件验证。
- 我将能够从发送到电子邮件以进行验证的 url 中解析 actionCode。
所以只有几个问题。我是否需要拥有自己的自定义服务器才能处理这样的电子邮件验证?这一切都可以通过firebase控制台完成吗?当我发送电子邮件时,我是在发送动态链接还是电子邮件模板发送控制台中的内容?
我找不到任何人在颤振中实现这一点的例子,所以如果有人能指出我正确的方向。我一直在努力思考我需要什么才能完成这项工作。如果您需要更多信息以进行澄清,请告诉我。
解决方案
我是否需要拥有自己的自定义服务器才能处理这样的电子邮件验证?这一切都可以通过firebase控制台完成吗?
Firebase 可以处理 Firebase Auth 中电子邮件验证的所有过程。
当我发送电子邮件时,我是在发送动态链接还是电子邮件模板发送控制台中的内容?
从 Firebase Auth 发送的电子邮件验证使用 Firebase 控制台中的模板。
用于发送电子邮件验证和验证应用中链接的 Flutter 代码类似于 Android 文档中的内容。
FirebaseAuth _auth = FirebaseAuth.instance;
var emailAuth = "someemail@domain.com";
void sendEmailVerification() {
var acs = ActionCodeSettings(
// URL you want to redirect back to. The domain (www.example.com) for this
// URL must be whitelisted in the Firebase Console.
url: "https://www.example.com/finishSignUp?cartId=1234",
handleCodeInApp: true,
iOSBundleId: "com.example.ios",
androidPackageName: "com.example.android",
androidInstallApp: true,
androidMinimumVersion: "12");
_auth.sendSignInLinkToEmail(
email: emailAuth, actionCodeSettings: acs)
.catchError(
(onError) => print('Error sending email verification $onError'))
.then((value) {
print('Successfully sent email verification');
});
}
void checkEmailLinkAuth(String emailLink) async {
if (_auth.isSignInWithEmailLink(emailLink)) {
await _auth
.signInWithEmailLink(email: emailAuth, emailLink: emailLink)
.catchError(
(onError) => print('Error signing in with email link $onError'))
.then((value) {
// You can access the new user via value.user
// Additional user info profile *not* available via:
// value.additionalUserInfo.profile == null
// You can check if the user is new or existing:
// value.additionalUserInfo.isNewUser;
var userEmail = value.user;
print('Successfully signed in with email link!');
});
}
}
推荐阅读
- node.js - 猫鼬中的model.find({})没有给出db.model.find()的输出
- java - 访问控制练习 - java
- javascript - 拖动 CSS 旋转的 div
- android - 根据动态类型获取领域数据
- python - 是否有更快的方法来写入或读取大约 100 万行的 pandas 数据帧
- tinymce - 如何删除tiny mce插件的表默认属性
- oracle - 空游标和异常
- sql - sql取模大数
- angular - 如何在 Angular -5 中为一个输入单选按钮添加 2 (onclick)=""
- c# - 如何在 XAML 的不同选项卡(子项)中重用相同的“内容控制器”?