Muh*_*han 20 android facebook-authentication firebase firebase-authentication
我已成功部署了https://firebase.google.com/docs/auth/android/facebook-login中的教程代码,以便将Firebase身份验证登录与Facebook集成.用户已在Firebase Auth控制台中成功创建.
但是,我注意到用户对象中的电子邮件字段为空( - ).奇怪的是,我使用获取的令牌使用GraphRequest直接从提供者结果对象中成功检索了电子邮件信息.
根据我阅读的文档(https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser.html#getEmail()),应从登录提供商填充电子邮件字段.
一些额外的奇怪行为:
有什么我想念或做的我做错了吗?
这是我的代码:
public class LoginActivity extends AppCompatActivity {
private static final String TAG = "LOGIN_ACTIVITY";
private static final int RC_SIGN_IN = 777;
private EventBus eventBus;
private SweetAlertDialog pDialog;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private CallbackManager mCallbackManager;
private ImageView mPasswordVisibilityView;
private TextView txtPassword;
private boolean justEnteredAuthStateChanged = false;
private GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.login);
// Firebase
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
final FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Util.logassert("Auth Provider = " + firebaseAuth.getCurrentUser().getProviderId()); // this is called twice, values of Provider = Firebase
Util.logassert("total provider = " + user.getProviderData().size()); // output = 2. "Firebase" and "facebook.com"
for (int i = 0; i < user.getProviderData().size(); i++) {
UserInfo info = user.getProviderData().get(i);
Util.logassert(info.getProviderId() + ", email = " + info.getEmail()); // both empty
Util.logassert("current provider = " + info.getProviderId() + " - " + info);
}
} else {
Util.logassert("onAuthStateChanged user logged out");
}
// ...
}
};
mAuth.addAuthStateListener(mAuthListener);
// Firebase Facebook TapAuth
// Initialize Facebook Login button
mCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Util.logassert("facebook:onSuccess:" + loginResult);
handleFacebookAccessToken(loginResult.getAccessToken());
Util.logassert("granted = " + loginResult.getRecentlyGrantedPermissions()); // output [email and public_profile]
Util.logassert("denied = " + loginResult.getRecentlyDeniedPermissions());
}
@Override
public void onCancel() {
Util.logassert("facebook:onCancel");
// ...
}
@Override
public void onError(FacebookException error) {
Util.logassert("facebook:onError" + error.getMessage());
// ...
}
});
FancyButton btnFacebook = (FancyButton) findViewById(R.id.btn_facebook_share);
btnFacebook.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile", "email"));
Util.logassert("try facebook login");
}
});
txtPassword = (EditText) findViewById(R.id.input_password);
}
private void handleFacebookAccessToken(AccessToken token) {
Util.logassert("handleFacebookAccessToken:" + token);
GraphRequest request = GraphRequest.newMeRequest(
token,
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(
JSONObject object,
GraphResponse response) {
// Application code
Log.v("LoginActivity", response.toString());
Util.logassert("graph res = " + response.getRawResponse());
try {
/* successfully output email address from graph request here */
FbGraphEvent event = new FbGraphEvent(response.getJSONObject().getString("email"), response.getJSONObject().getString("name"));
EventBus.getDefault().postSticky(event);
} catch (Exception e) {
Log.e("MomInvoice", "Error in parsing json fb graph", e);
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "email,name");
request.setParameters(parameters);
request.executeAsync();
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Util.logassert("signInWithCredential:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
Util.logassert("signInWithCredential failed coz = " + task.getException().getMessage());
Toast.makeText(LoginActivity.this, "Authentication failed :(",
Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onStart() {
super.onStart();
Util.logassert("masuk onStart LoginActivity");
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
super.onDestroy();
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (mCallbackManager != null) {
mCallbackManager.onActivityResult(requestCode, resultCode, data);
Util.logassert("hasilx " + requestCode + " = " + resultCode);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Muh*_*han 34
在阅读firebase-talk google小组的帖子后,https: //groups.google.com/forum/#!topic / firebase-talk/gPGNq-IkTLo ,我找到了答案.发生此问题是因为我在Firebase Auth登录方法中使用"允许使用相同的电子邮件地址创建多个帐户".
所以我将选项更改为:"使用相同的电子邮件地址阻止创建多个帐户",它现在可以正常工作.这很简单.确实,我需要更多逻辑来合并具有相同电子邮件地址的帐户,但这没关系.
也许其他人都有同样的问题,也可以试试这个,希望它也能解决.
Ars*_*hak 12
一些 Facebook 帐户是使用手机号码创建的,因此每当我们请求电子邮件地址时,我们都会得到一个空字符串。
在下图中,您可以看到 Facebook 帐户可以将其主要联系人设置为电子邮件地址或手机号码。因此,如果一个人已将手机号码标记为主要号码,则无法检索其电子邮件地址。
就我而言,我忘记验证我的 facebook 帐户,所以最初我的电子邮件地址甚至没有显示在主要联系人中。因此,如果您没有收到电子邮件地址,请转到常规设置并查看主帐户是否设置为电子邮件地址。
我发现了同样的问题,其中电子邮件在firebase auth上设置为" - ".我没有阅读电子邮件的许可,我修正了:
LoginButton mFacebookSignInButton = (LoginButton) findViewById(R.id.facebook_sign_in_button);
mFacebookSignInButton.setReadPermissions("email", "public_profile");
Run Code Online (Sandbox Code Playgroud)
我希望这有助于将来有同样的问题.
这对我有用。
providerDataFirebaseUser 中有一个叫做的东西。它由两项数据组成,一项来自 Firebase,另一项来自您的登录提供商(Google、Facebook 等)。
我能够从第二个提供者数据处获取电子邮件。
| 归档时间: |
|
| 查看次数: |
12721 次 |
| 最近记录: |