簡體   English   中英

使用Google Play游戲進行Firebase身份驗證

[英]Firebase Authentication with 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控制台中錯誤地配置了游戲?

我當前的代碼: 鏈接

您在這里跳過了必要的步驟。 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); } // ... } }); } 

希望有幫助! 您可以在此處此處找到文檔中引用的完整代碼(這些是它們在文檔中顯示摘錄的文件)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM