首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过Firebase实现安卓的GitHub认证

通过Firebase实现安卓的GitHub认证
EN

Stack Overflow用户
提问于 2021-03-30 19:33:42
回答 1查看 223关注 0票数 0

您好,我想知道如何访问用户电子邮件,同时通过我的android应用程序中的Github验证用户。我使用的是firebase和android studio。请注意,我不能在onSuccesslistner中使用user.getEmail,因为我也在使用谷歌身份验证,它抛出异常,即电子邮件已经存在,挂起的任务方法只在第一次工作。基本上,我想使用setScopes来检索用户电子邮件。我必须得到电子邮件,并检查用户是否存在于我的数据库中的简单登录的用户。

以下是我的代码:

代码语言:javascript
运行
复制
    public void git_login(View view)
        {
            SignInWithGithubProvider(
                    OAuthProvider.newBuilder("github.com")
                            .setScopes(
                                   new ArrayList<String>()
                                    {
                                        {
                                            add("user:email");
                                        }
                                    }).build()
            );
        }
    
        private void SignInWithGithubProvider(OAuthProvider login)
        {
            Task<AuthResult> pendingResultTask= mAuth.getPendingAuthResult();
            if (pendingResultTask!=null)
            {
                // There's something already here! Finish the sign-in for your user.
                pendingResultTask
                        .addOnSuccessListener(
                                new OnSuccessListener<AuthResult>() {
                                    @Override
                                    public void onSuccess(AuthResult authResult) {
                                        Toast.makeText(getApplicationContext(), "User Exist" + authResult, Toast.LENGTH_SHORT).show();
                                        // User is signed in.
                                        // IdP data available in
                                        // authResult.getAdditionalUserInfo().getProfile().
                                        // The OAuth access token can also be retrieved:
                                        // authResult.getCredential().getAccessToken().
                                    }
                                })
                        .addOnFailureListener(
                                new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        // Handle failure.
                                    }
                                });
            }
            else {
                // There's no pending result so you need to start the sign-in flow.
                // See below.
                mAuth.startActivityForSignInWithProvider(this , login).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
    
                        if (e.toString().equals("com.google.firebase.auth.FirebaseAuthUserCollisionException: An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address."))
                        {
                            showDialogAlert();
                        }
                    }
                }).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {
                        FirebaseUser user = mAuth.getCurrentUser();
                        Toast.makeText(getApplicationContext(), "Login" + user.getUid() +"\n"+user.getEmail(), Toast.LENGTH_SHORT).show();
                        userNameForDb = user.getDisplayName();
                        userImageForDb = String.valueOf(user.getPhotoUrl());
                        userEmailForDb = user.getEmail();
                        Toast.makeText(CreateNewAccountActivity.this, "Account added to Firebase: " +userNameForDb+"\n"+userEmailForDb+"\n"+userTokenForDb, Toast.LENGTH_SHORT).show();
                        saveDataToDb(userNameForDb , userEmailForDb , userTokenForDb);
                    }
                });
    
            }
        }
代码语言:javascript
运行
复制
EN

回答 1

Stack Overflow用户

发布于 2021-03-30 20:25:36

我想知道如何在通过Github对用户进行身份验证时访问用户电子邮件

我能想到的最简单的解决方案是,一旦您成功地通过了身份验证,您就可以从"userInfo“对象中获取电子邮件地址,如以下代码行所示:

代码语言:javascript
运行
复制
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser != null) {
    for (UserInfo userInfo : firebaseUser.getProviderData()) {
        if (userInfo.getProviderId().equals("github.com")) {
            Log.d(TAG, "User is signed in with Github");
            Log.d(TAG, "email: " + userInfo.getEmail());
        }
    }
}

logcat中的输出将是用户用于身份验证过程的电子邮件地址。

编辑:

这是真的,如果用户已经注册了一个Gmail帐户,你会得到一个异常,说这样的帐户已经存在。因此,您需要使用Google凭证进行身份验证。

在这种情况下,我实际上想要获取用户id,并希望在我的数据库中检查它,该数据库是我的本地服务器,即这封电子邮件是否存在。

不需要这样做,因为您可以处理异常,并向用户表明Google帐户已经存在,然后只需使用Google凭据进行身份验证。如果没有例外,很明显这个用户还不存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66870207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档