栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Unity】Firebase-Google登录身份验证功能接入流程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Unity】Firebase-Google登录身份验证功能接入流程

思路:接入sdk相关Android接口以aar形式提供给Unity使用

目录

一、创建Firebase项目工程

二、创建Android工程 接入Android接口

三、Unity工程配置


参考文档:https://firebase.google.com/docs/auth/android/google-signin#java_1

一、创建Firebase项目工程

https://console.firebase.google.com

进入到console创建工程,按照步骤进行,进入到具体工程console面板后,找到

 添加测试用户

启动Google身份验证

 

 

 

进行到此时下载google-services.json  上面截图有这个按钮,下载下来后 把它拷贝到工程/Assets下,Unity工程,如果你是安卓则拷贝到安卓的应用工程根目录下。创建应用必须确保签名sha和包名和你Unity项目一样的。

此时已经进行完基本的Firebase工程配置

二、创建Android工程 接入Android接口

1、需在(应用级)app/build.gradle添加如下依赖

dependencies {

    ...

    implementation platform('com.google.firebase:firebase-bom:28.4.0')
    implementation 'com.google.firebase:firebase-analytics'
    implementation 'com.google.firebase:firebase-auth'
    implementation 'com.google.android.gms:play-services-auth:19.2.0'
}

 其中analytics可能不需要 它是一个firebase分析工具的依赖

2、配置Firebase项目具体应用的SHA指纹,需要准备Unity包签名文件keystore 用如下文档方式进行获取SHA。(上方已经提及,这里给个文档)

https://developers.google.com/android/guides/client-auth

3、具体接口代码接入 MainActivity.java代码源码:

package com.test.googleloginTest1102;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseApp;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class MainActivity extends UnityPlayerActivity {

    private GoogleSignInClient mGoogleSignInClient;
    private FirebaseAuth mAuth;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            FirebaseApp.initializeApp(MainActivity.this);
        }catch (Exception e){
            Log.e("Unity", "App init fail: " + e.getMessage());
        }
        super.onCreate(savedInstanceState);
    }

    @Override
    public void onStart() {
        super.onStart();

        try {
            mAuth = FirebaseAuth.getInstance();
            // Check if user is signed in (non-null) and update UI accordingly.
            FirebaseUser currentUser = mAuth.getCurrentUser();
        }catch (Exception e){
            Log.e("Unity", "mAuth为nil n" + e.getMessage());
        }
        //TODO 检查用户是否已登录
//        updateUI(currentUser);
    }

    public void GoogleLogin()
    {
        // Configure Google Sign In
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("填写你获取的idtoken")
                .requestEmail()
                .build();

        mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        Intent signInIntent = mGoogleSignInClient.getSignInIntent();
        startActivityForResult(signInIntent, 100);
    }

    @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 == 100) {
            Task task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                Log.d("Unity", "firebaseAuthWithGoogle:" + account.getId());
                //沟通Unity传递idToken执行登录流程
                Log.i("Unity", "Id Token:" + account.getIdToken());
//                UnityPlayer.UnitySendMessage("GoogleLoginComponent", "GoogleLogin", account.getIdToken());
                firebaseAuthWithGoogle(account.getIdToken());
            } catch (ApiException e) {
//                com.google.android.gms.common.api.ApiException: 10:
                // Google Sign In failed, update UI appropriately
                Log.w("Unity", "Google sign in failed", e);
                //TODO Google登录异常回调?
            }
        }
    }

    private void firebaseAuthWithGoogle(String idToken) {
        Log.i("Unity", "firebaseAuthWithGoogle: " + idToken);
        AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
        mAuth.signInWithCredential(credential)
                .addonCompleteListener(this, new onCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if (task.isSuccessful()) {
                            // Sign in success, update UI with the signed-in user's information
                            Log.d("Unity", "signInWithCredential:success");
                            FirebaseUser user = mAuth.getCurrentUser();
                            //TODO 回调unity userId
                            Log.d("Unity", "用户id:" + user.getUid());
//                            updateUI(user);
                        } else {
                            // If sign in fails, display a message to the user.
                            Log.w("Unity", "signInWithCredential:failure", task.getException());
//                            updateUI(null);
                        }
                    }
                });
    }
}

上方,requestIdToken("填写你获取的idtoken"),这个idtoken获取方法:

https://developers.google.com/identity/sign-in/android/start-integrating#get_your_backend_servers_oauth_20_client_id

按照步骤进行选中你的项目和应用,填写应用使用的sha和包名,最终获得一份带idtoken的配置,复制粘贴到上面的方法里传递进去。

最终会通过Intent方式回调一个携带了GoogleSignInAccount的task获取到account之后拿到它的用户id token进行一个firebaseAuthWithGoogle方法,它是客户端的身份验证。

如需做服务器的身份验证,需要参考服务器文档如下:

http方式:https://developers.google.com/identity/sign-in/android/backend-auth

游戏服务器java c# python等:https://firebase.google.com/docs/auth/admin/verify-id-tokens

值得注意的地方:

1、AndroidManifest.xml需要添加

 

2、由于使用UnityPlayerActivity类,它是Unity的classes.jar包里的类,但是在Unity2019可能会发现它不见了,具体解决方法:

Unity接入第三方SDK aar/jar没有sdk的依赖文件 和 Unity2019丢失UnityPlayerActivity问题_两水先木示的博客-CSDN博客

注销用户方法:

FirebaseAuth.getInstance().signOut();

注意:登录邮箱尽可能不要选择用开发者邮箱,如果无法登录可以选择美国邮箱测试下

安卓工程需切成库工程,即app/build.gradle修改

 2点,改掉plugins内的 和 defaultConfig applicationId去掉。

Build生成aar,解压它,获取它根目录的classes.jar和AndroidManifest.xml,其中classes.jar里需要删除掉BuildConfig.class 不然会起冲突。(我使用【7z解压软件】能直接打开jar包 进行直接删除文件,如果不是需要解压jar后 删除文件 再压缩回去。)

接着jar和xml复制到工程Assests/Plugins/Android下,后续则是正常的Unity调用Android代码,不再阐述。

三、Unity工程配置

1、classes.jar 和 AndroidManifest.xml (上面已经提及)

2、google-services.json (上面已经提及)

3、配置Unity的gradle配置!(这个和安卓一样也是应用级的gradle)

 PlayerSettings-Build里勾选这个,然后编辑它

dependencies {		
    implementation fileTree(dir: 'libs', include: ['*.jar'])	
	implementation 'com.google.android.gms:play-services-auth:19.2.0'
	implementation 'com.google.firebase:firebase-auth:21.0.1'
**DEPS**}

引入firebase和google的依赖。

此时还是会出点问题,缺少了FirebaseAuth.unitypackage包的一些依赖配置文件。需要去下载FirebaseAuth.unitypackage 进行force resolve之后,获取到FirebaseApp.androidlib文件夹,把这个文件夹拷贝到我们的工程Plugins/Android里即可。

(注意:FirebaseAuth.unitypackage的内容 需要删除掉,不过最好是新建一个空工程 并且签名一直 google-services.json要导入后,进行force resolve生成依赖配置文件,再直接拷贝FirebaseApp.androidlib文件夹到我们的项目!)

至于为什么我不直接用FirebaseAuth.unitypackage 而是采取这种特殊的方式,是因为这个包其实包含了很多额外的东西,我只需firebase google身份验证,所以采用这种特别的方式去进行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/458636.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号