您好,我想知道如何在我的 Android 应用程序中通过 Github 对用户进行身份验证时访问用户电子邮件。我正在使用 firebase 和 android studio。请注意,我不能在 user.getEmail
中使用 onSuccesslistner
,因为我也在使用 Google 身份验证,这会引发异常电子邮件已经存在并且挂起的任务方法仅适用于第一次。基本上我想使用 setScopes
来检索用户电子邮件。我必须获取电子邮件并检查用户是否存在于我的数据库中,只需登录用户即可。
这是我的代码:
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);
}
});
}
}
```
答案 0 :(得分:0)
我想知道如何在通过 Github 验证用户身份的同时访问用户电子邮件
我能想到的最简单的解决方案是,一旦您成功通过身份验证,您就可以像以下代码行一样从“userInfo”对象中获取电子邮件地址:
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 凭据进行身份验证。如果没有Exception,很明显用户还不存在。