首页 > 解决方案 > 如果在点击链接后尝试返回移动应用程序,如何处理电子邮件验证?

问题描述

所需行为:当我在我的应用程序中按下“注册”按钮时,它会向指定的电子邮件发送一个验证链接,并导航到移动应用程序中的一个验证页面,该页面会提醒用户已发送验证电子邮件。然后用户可以转到自己的电子邮件并单击将验证用户的链接,然后将他们引导回验证页面,它将重新加载用户并将其发送到主页。

问题:我需要做什么才能处理这个问题?

我做过的事情

  1. 我有一个自定义域,我们称之为customdomain.com. 我已经使用 firebase 托管进行了设置。

  2. 我在 firebase 控制台中创建了一个名为的动态链接customdomain.com/verify

  3. 我创建了 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);
        }
     }
    
  4. 我已经设置了我的 androidManifest.xml 和 build.gradle 来处理动态链接。

假设

  1. 我可以在我的验证页面上使用 ValueNotifier 来监听 isEmailVerified 的变化。
  2. 我需要更改我的电子邮件模板以创建自定义电子邮件操作处理程序?(https://firebase.google.com/docs/auth/custom-email-handler?)
  3. 我不需要在 customdomain.com 上创建网页来处理电子邮件验证。
  4. 我将能够从发送到电子邮件以进行验证的 url 中解析 actionCode。

所以只有几个问题。我是否需要拥有自己的自定义服务器才能处理这样的电子邮件验证?这一切都可以通过firebase控制台完成吗?当我发送电子邮件时,我是在发送动态链接还是电子邮件模板发送控制台中的内容?

我找不到任何人在颤振中实现这一点的例子,所以如果有人能指出我正确的方向。我一直在努力思考我需要什么才能完成这项工作。如果您需要更多信息以进行澄清,请告诉我。

标签: firebaseflutterfirebase-authenticationfirebase-dynamic-links

解决方案


我是否需要拥有自己的自定义服务器才能处理这样的电子邮件验证?这一切都可以通过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!');
    });
  }
}

推荐阅读