当前位置: 首页 > 知识库问答 >
问题:

使用Google Play游戏进行Firebase认证

韩季
2023-03-14

我正在为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 Games弹出窗口,我得到了身份验证失败的toast和cu被设置为“no UID”。

有人能解释一下这是怎么工作的吗?

编辑

我需要运行一个函数来显示这个对话框吗?我是否遗漏了什么,或者只是我在google play控制台中错误地配置了游戏?

我的当前代码:链接

共有1个答案

魏刚豪
2023-03-14

你跳过了一个重要的步骤。Firebase文档通常很好,但游戏登录描述得很差。

您完成了第一步:您需要设置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);
            }
        }
    }
    

    最后,您的html" target="_blank">代码开始发挥作用。现在我们有了GoogleSigninAccount,调用PlayGamesAuthProvider.getCredential(...)需要它。你在这里传递了你的客户身份,但那是错误的。它是这样工作的:你把你的客户ID给谷歌,只是为了告诉他们你是谁(或哪个应用程序)。他们会让用户登录并给你一个特殊的令牌(“ID令牌”),然后Firebase可以使用该令牌从Google Play Games中获取用户的信息。这就是你需要给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);
                    }
    
                    // ...
                }
            });
    }
    

    希望能有所帮助!您可以在这里和这里找到文档中引用的整个代码(这些文件显示了文档中的代码片段)。

  •  类似资料:
    • 我想在我的LibGDX Android游戏中使用Google Play Game Services API的成就和排行榜。我所做的唯一一件事就是从游戏服务开发者网站上获取运行的示例。我已经尝试在我的项目中使用这段代码很多天了,但仍然一无所获。我也尝试过学习本教程http://helios.hud.ac.uk/u1070589/blog/?p=202但我没有“主游戏类(从ApplicationLis

    • 用户输入赌徒开始资金的整数值用户输入赌徒期望资金的整数值-如果赌徒的资金达到这个值,他就退出游戏用户输入要执行的试验次数的整数值-每次试验将由足够的游戏组成,要么将赌徒资金减少到零,要么将其增加到期望的资金声明一个整数变量(设置为零)来跟踪解决方案的获胜次数,显然,将由嵌套循环结构和选择结构组成,第一个循环(外循环)将循环执行所需的试玩次数设置现金等于赌注第二个循环(内循环)将模拟一张牌游戏的结果

    • 我用Unity3d制作了一个游戏。我想在游戏中制作一个按钮,玩家可以点击这个按钮链接GooglePlay,给我的游戏打分。我需要什么插件,如何做到这一点?我刚找到这个:链接

    • 球门 我对机器学习相当陌生,经过一些在线教育后,这是我的第一个真正的项目。这是一个叫做Ouril的游戏,在这个游戏中,你和你的对手各有六个“房子”,里面有四块起始石头。你轮流玩一个房子和分配它的石头,这可能会让你获得对手的石头。你赢得了25块石头。 该项目的目标是拥有一个经过训练的函数,可以在给定当前游戏状态的情况下预测一个动作的好坏,以便机器人可以选择最好的预测动作并进行游戏。 安装程序 我构建

    • 我的firebase cloud函数包含受保护的路由,只有在请求头中传递有效的IdToken时才能访问这些路由。云函数API如下所示 最初,我使用Firebase身份验证创建新用户并获取IdToken 我可以使用Auth emulator UI创建新用户,但是如何生成这些用户的访问令牌呢?是否有任何APIendpoint可以返回本地保存的用户的IdToken,这样我就可以测试受保护的API,而无需

    • 项目设置:Intellj- 我正在尝试启动并运行我的数据库。我可以单击“立即应用此脚本”按钮。 单击后,应用程序将正常启动。但当我查看默认DB和公共模式时,什么都没有。 我正在使用Intellj的集成DB工具打开DB。 该项目在GitHub上(如果更好,我也可以发布重要文件) 当我直接从控制台运行脚本时,它可以按预期工作。 如何以及在哪里可以检查脚本是否已执行以及在哪里执行?

    • 我问这个问题的动机是,我发现了一个在图数据集上使用机器学习的有趣问题。有关于这个主题的论文。例如,“从有向图上的标记和未标记数据中学习”(周,黄,斯科普夫)。然而,我没有人工智能或机器学习的背景,所以在从事任何科学工作之前,我想为更普通的观众写一个更小的程序。 几年前,我写了一款名为Solumns的游戏。它是经典世嘉游戏《柱子》的邪恶变体。受巴斯特的启发,它暴力地选择对玩家不利的颜色组合。这很难。

    • 我正在构建一个android应用程序,它使用Firebase作为后端,并采用模型、视图和演示者架构。然而,Firebase是一种云服务的事实使我的android应用程序中的自动测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法看到如何在我的应用程序中实现Firebase代码的单元测试。在端到端测试方面,我也陷入了困境。 由于测试是任何android应用程序的基础,没有it应用程序开发