使用Google Play游戏进行Firebase身份验证

时间:2019-06-16 11:19:47

标签: java android firebase firebase-authentication google-play-games

我正在为Android创建游戏。每个用户都需要进行身份验证。

当前,当新用户启动游戏时,它将向我的服务器请求一个识别码,并将其存储到SharedPreferences中。下次用户启动游戏时,它将使用此存储的标识码进行身份验证。问题是,当用户清除此应用程序的数据时,他无法取回其ID,因此他永远失去了自己的进步。

有没有办法使用Firebase Play游戏auth方法生成一个唯一且始终相同的识别码之类的东西?

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestServerAuthCode("MyCID")
                .build();

        mAuth = FirebaseAuth.getInstance();
        super.onCreate(savedInstanceState);
        final FirebaseAuth auth = FirebaseAuth.getInstance();
        AuthCredential credential = PlayGamesAuthProvider.getCredential("MyCID");
        auth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            currentUser = auth.getCurrentUser();
                        } else {
                            Toast.makeText(MainActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });
        if (currentUser == null) {
            cu = "NO UID";
        } else {
            cu = currentUser.getUid();
        }

我尝试了此代码(这是MyCID:我使用了下图中的CID),但是没有显示Google Play游戏弹出式窗口,我得到了Authentication Failed Toast,并且cu设置为“ NO UID”。

MyCID

有人可以请问这是如何工作的吗?


编辑

由于@crysxd,我的应用程序现在显示绿色的Google Play游戏弹出窗口。但是我没有看到预期的“选择帐户”弹出窗口,而是看到“ com.google.android.gms.common.api.ApiException:4:”,这是我在使用Google游戏登录的其他游戏中看到的。

是否需要运行一个函数来显示此对话框?我是否缺少某些东西,或者只是我在Google Play控制台中错误地配置了游戏?

我当前的代码:link

1 个答案:

答案 0 :(得分:2)

您在这里跳过了必要的步骤。 Firebase文档通常非常出色,但是Play登录的描述却很少。

您正确地迈出了第一步:您需要设置GoogleSignInOptions,但是错过了将它们传递给GoogleSignInClient的过程。

  • onCreate中创建客户端:

    private static final int RC_SIGN_IN = 543;
    private GoogleSignInClient mGoogleSignInClient;
    
    public void onCreate(Bundle savedInstancestate) {
        super.onCreate(savedInstancestate)
    
        // ...
    
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
                .requestServerAuthCode("MyCID")
                .build();
    
        mGoogleSignInClient= GoogleSignIn.getClient(this, gso)
    }
    
  • 在单击登录按钮或要开始登录时调用此方法。这将导致显示登录对话框。

    private void signIn() {
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }
    
  • 获得响应并进行处理

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        // Result returned from launching the Intent from 
        GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e);
            }
        }
    }
    
  • 最后,您的代码开始起作用了。现在我们有了GoogleSignInAccount才能调用PlayGamesAuthProvider.getCredential(...)。您在此处传递了客户ID,但这是错误的。它是这样工作的:您将客户ID提供给Google只是为了告诉他们您是谁(或哪个应用程序)。他们将允许用户登录并为您提供一个特殊的令牌(“ id令牌”),然后Firebase可以使用该令牌从Google Play游戏获取有关用户的信息。这就是您需要在此处给Firebase的令牌:

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
    
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        Snackbar.make(findViewById(R.id.main_layout), "Authentication Failed.", Snackbar.LENGTH_SHORT).show();
                        updateUI(null);
                    }
    
                    // ...
                }
            });
    }
    

希望有帮助!您可以在文档herehere中找到引用的完整代码(这些是它们在文档中显示摘录的文件)。