Firebase UI 电子邮件链接登录意图额外为空

Posted

技术标签:

【中文标题】Firebase UI 电子邮件链接登录意图额外为空【英文标题】:Firebase UI Email Link signin intent extra is null 【发布时间】:2020-02-09 12:05:54 【问题描述】:

以下 3 个函数用于设置电子邮件和其他身份验证检查(按顺序调用)

    private void buildSignInIntentBuilder() 

        ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
                        .setandroidPackageName(getString(R.string.packageName), true, null)
                        .setHandleCodeInApp(true)
                        .setUrl(getString(R.string.dynamic_link_url))
                        .build();

        List<AuthUI.IdpConfig> providers = Arrays.asList(
                new AuthUI.IdpConfig.EmailBuilder()
                        .enableEmailLinkSignIn()
                        .setActionCodeSettings(actionCodeSettings)
                        .build(),
                // new AuthUI.IdpConfig.EmailBuilder().setRequireName(false).build(),
                new AuthUI.IdpConfig.PhoneBuilder()
                        .build(),
                new AuthUI.IdpConfig.GoogleBuilder()
                        .build(),
                new AuthUI.IdpConfig.FacebookBuilder()
                        .build());

        signInIntentBuilder = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setIsSmartLockEnabled(false)
                .setAvailableProviders(providers)
                .setLogo(R.drawable.icon_forget_me_not_1);
    

    private void catchEmailLinkSignIn() 
        Log.d(TAG, "Intent: " + getIntent().getExtras());
        if (AuthUI.canHandleIntent(getIntent())) 
            if (getIntent().getExtras() == null) 
                return;
            

            String link = getIntent().getExtras().getString(ExtraConstants.EMAIL_LINK_SIGN_IN);
            Log.d(TAG, "link: " + link);
            if (link != null) 
                signInIntentBuilder.setEmailLink(link);
            
        
    

    private void createCheckAndSigninListener() 
        // set firebase sign in listener
        mAuthStateListner = firebaseAuth -> 
            // Already logged in
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) 
                Log.d(TAG, "user already signed in");
                // Check user even if signed in to register him to database (if haven't)
                FirebaseAuthHelper.getInstance().checkRegisterUser(user, this, CHECK_USER_DB);
             else 
                Log.d(TAG, "user hasn't signed in");
                // Signed out or hasn't logged in
                startActivityForResult(
                        signInIntentBuilder
                                .build(),
                        RC_SIGN_IN
                );

            
        ;
    

我已与 firebase 托管建立了动态​​链接。并且能够在单击收到的电子邮件链接后重定向到相同的活动。

然而,

String link = getIntent().getExtras().getString(ExtraConstants.EMAIL_LINK_SIGN_IN);
Log.d(TAG, "link: " + link); // --> produces "link: null"

显示尽管成功获得了意图,但 getExtras() 中没有额外的 EMAIL_LINK_SIGNIN。我花了几个小时查看 FirebaseUi 的源代码,但我没有找到常量 EMAIL_LINK_SIGN_IN 的使用位置以及动态链接的意图是如何解析的。

感谢您提供任何解决此问题的方法。我已经花了一整天的时间试图弄清楚这一点。

【问题讨论】:

我发现了,改用intent.getresult.tostring。 【参考方案1】:

不要使用String link = getIntent().getExtras().getString(ExtraConstants.EMAIL_LINK_SIGN_IN); ,而是使用getIntent().getData().toString();

【讨论】:

感谢您的回答。虽然它与我不再相关。我刚刚检查了 FireBaseUI firebase.google.com/docs/auth/android/email-link-auth 上的较新文档。官方文档现在更新为使用String emailLink = intent.getData().toString();(所以当我阅读它时,文档是错误的/过时的)。而不是String emailLink = intent.getExtras().toString();。你能确认他们两个都有效还是只有getExtras有效? 这两个是什么意思?另外,请您接受答案,以便其他读者可以看到解决方案。 请检查上面的链接以获取电子邮件身份验证。它使用.getData() 而不是.getExtra()。您的回答目前与官方文档冲突。我只是想在接受之前仔细检查。 我已经对两者进行了测试,我可以确认它们都可以在我的设备上运行。但我仍然更新了答案以适应官方文档

以上是关于Firebase UI 电子邮件链接登录意图额外为空的主要内容,如果未能解决你的问题,请参考以下文章

com.firebase.ui.auth.FirebaseUiException:提供程序错误 - Firebase-UI 身份验证 Facebook 登录不起作用

在电子邮件密码身份验证中进行额外的自定义检查 (Flutter - Firebase)

使用 Firebase 电子邮件链接登录进行 e2e 测试?

使用 Firebase 用户管理添加额外字段

Firebase Auth Ui Google 登录“开发者错误”

iOS Firebase 登录