gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:30:17 25 4
gpt4 key购买 nike

我正在为安卓开发一款游戏。每个用户都需要进行身份验证。

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

有没有一种方法可以使用 Firebase Play 游戏身份验证方法生成诸如识别码之类的东西,它对于一个玩家来说是唯一的并且始终相同?

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 弹出窗口,我收到身份验证失败提示并且 cu 设置为“NO UID”。

MyCID

有人可以解释一下这是如何工作的吗?


编辑

感谢@crysxd,我的应用程序现在显示绿色的 google play 游戏弹出窗口。但是,正如我在其他使用谷歌游戏登录的游戏中看到的那样,我没有看到预期的“选择帐户”弹出窗口,而是出现错误,显示“com.google.android.gms.common.api.ApiException:4:”。

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

我当前的代码:link

最佳答案

你在这里跳过了一个重要的步骤。 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);
    }
    }
    }
  • 最后,您的代码开始发挥作用。现在我们有了调用 PlayGamesAuthProvider.getCredential(...) 所需的 GoogleSignInAccount。您在此处传递了您的客户 ID,但这是错误的。它是这样工作的:您将您的客户端 ID 提供给 Google 只是为了告诉他们您是谁(或哪个应用程序)。他们会让用户登录并给你一个特殊的 token (“id token ”),然后 Firebase 可以使用它从 Google Play 游戏中获取有关用户的信息。这就是您需要在此处提供给 Firebase 的 token :

    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 (这些是他们在文档中显示 fragment 的文件)。

关于java - 使用 Google Play 游戏进行 Firebase 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56618325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com