❤️Android Google 登录接入❤️

15,733 阅读4分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

接入首先咱们看官方文档一键登录的内容。默认你已经能去Google API那边玩了。

🔥 文档图解

💥 设置你的 Google API 控制台项目

🌀 1、创建项目

API 控制台中打开您的项目,如果您还没有项目,请创建一个。

没有项目,咱们就创建一个。

修改项目ID:项目 ID 可以包含小写字母、数字或连字符,必须以小写字母开头并以字母或数字结尾。

项目创建好了,咱继续往下走。

🌀 2、完善 OAuth 同意屏幕信息

在 OAuth 同意屏幕页面上,确保所有信息都完整准确。特别是,请确保您已指定应用程序的隐私政策和服务条款的 URL。

你就顺着提示往下走。如下:

🌀 3、创建 Android 客户端 ID(失败)

在 凭证 页面上,创建一个 Android 客户端 ID(需要指定应用程序的包名称和 SHA-1 签名)。

SHA1由来。

🌀 4、创建 Web 客户端 ID(推荐)

在 凭证 页面上,创建一个 Web 应用程序客户端 ID。将 JavaScript 来源 和 重定向 URI 字段留空

使用Android客户端调用登入失败,使用Web客户端调用成功,后面咱有测试。

Google API 控制台项目设置暂时完成,下面咱们添加依赖项。

💥 添加依赖项

🌀 1、在 build.gradle (Project) 中添加 google()

确保你的buildscript和allprojects 部分中都包含 Google 的 Maven 存储库() 。

buildscript {
    repositories {
        google()
        mavenCentral()
    }
    ...
}
allprojects {
    repositories {
        google()
        mavenCentral()
        jcenter() 
    }
}

🌀 2、在 build.gradle (Module: app) 并中添加库

implementation 'com.google.android.gms:play-services-auth:19.2.0'

🔥 授权登录

💥 建立谷歌链接

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        signInClient();
    }
    private static final int SIGN_LOGIN = 901;
    private GoogleSignInClient mGoogleSignInClient;

    private void signInClient() {
        if (mGoogleSignInClient == null) {
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions
                    .DEFAULT_SIGN_IN)
                    .requestEmail()
                    .requestIdToken("376409831673-4bhkuj34dce0l8ktquse1261f3s2g487.apps.googleusercontent.com")
                    .build();
            mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
        }
    }

💥 启动登入和处理返回数据

    //启动登入
    startActivityForResult(getGoogleIntent(), SIGN_LOGIN);
        
    public Intent getGoogleIntent() {
        Intent signInInten;
        if (mGoogleSignInClient == null) {
            signInClient();
        }
        signInInten = mGoogleSignInClient.getSignInIntent();
        return signInInten;
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case SIGN_LOGIN:
                MLog.e("setActivityResultGoogle");
                Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
                if (task == null) {
                    MLog.e("task:null");
                }
                try {
                    GoogleSignInAccount account = task.getResult(ApiException.class);
                    MLog.e("Id:" + account.getId() + "|Email:" + account.getEmail() + "|IdToken:" + account.getIdToken());
                } catch (ApiException e) {
                    e.printStackTrace();
                    MLog.e("ApiException:" + e.getMessage());
                }
                break;
        }
    }

💥 开始测试

🌀 使用Android客户端ID测试(失败)

日志如下:

2021-10-29 13:48:30.706 9918-9918/? E/-SCC-: setActivityResultGoogle
2021-10-29 13:48:30.707 9918-9918/? E/-SCC-: ApiException:10: 

🌀 使用Web客户端ID测试(成功)

日志如下:

2021-10-29 13:53:25.057 13095-13095/? E/-SCC-: setActivityResultGoogle
2021-10-29 13:53:25.058 13095-13095/? E/-SCC-: Id:10637728323232286|Email:l2312327@gmail.com|IdToken:eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg1O(这个IdToken比较长)

🔥 配置一键登录

💥 建立谷歌链接

    private static final int SIGN_LOGIN = 901;

    private SignInClient oneTapClient;
    private BeginSignInRequest signInRequest;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        signInClient();
    }
    private void signInClient() {
        oneTapClient = Identity.getSignInClient(this);
        signInRequest = BeginSignInRequest.builder()
                .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
                        .setSupported(true)
                        .build())
                .setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                        .setSupported(true)
                        // Your server's client ID, not your Android client ID.
                        .setServerClientId("376409831673-4bhkuj34dce0l8ktquse1261f3s2g487.apps.googleusercontent.com")
                        .setFilterByAuthorizedAccounts(true)
                        .build())
                // Automatically sign in when exactly one credential is retrieved.
                .setAutoSelectEnabled(true)
                .build();
    }

💥 启动登入和处理返回数据

    //启动登入
    getGoogleIntent();

    public void getGoogleIntent() {
        oneTapClient.beginSignIn(signInRequest)
                .addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
                    @Override
                    public void onSuccess(BeginSignInResult result) {
                        try {
                            startIntentSenderForResult(
                                    result.getPendingIntent().getIntentSender(), SIGN_LOGIN,
                                    null, 0, 0, 0);
                        } catch (IntentSender.SendIntentException e) {
                            MLog.e("Couldn't start One Tap UI: " + e.getLocalizedMessage());
                        }
                    }
                })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure( Exception e) {
                        MLog.d("onFailure"+e.getLocalizedMessage());
                    }
                });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case SIGN_LOGIN:
                MLog.e("setActivityResultGoogle");
                try {
                    SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                    String idToken = credential.getGoogleIdToken();
                    String username = credential.getId();
                    String password = credential.getPassword();
                    if (idToken !=  null) {
                        MLog.e("username:"+username+"|password:"+password+"|idToken:"+idToken);
                    } else if (password != null) {
                        MLog.e("Got password.");
                    }
                } catch (ApiException e) {
                    MLog.e("ApiException:"+e.getMessage());
                }
                break;
        }
    }

💥 开始测试

🌀 使用Android客户端ID测试(失败)

日志如下:

2021-10-29 14:25:23.670 28927-28927/? E/-SCC-: setActivityResultGoogle
2021-10-29 14:25:23.670 28927-28927/? E/-SCC-: ApiException:10: Developer console is not set up correctly

这个报错是因为你传的ID不对。

// Your server's client ID, not your Android client ID.
.setServerClientId("376409831673-4bhkuj34dce0l8ktquse1261f3s2g487.apps.googleusercontent.com")

咱们把这里换成Web客户端ID测试。

🌀 使用Web客户端ID测试(成功)

日志如下:

2021-10-29 14:32:57.495 32021-32021/? E/-SCC-: setActivityResultGoogle
2021-10-29 14:32:57.496 32021-32021/? E/-SCC-: username:l2312327@gmail.com|password:null|idToken:eyJhbGciOiJSUzI1NiIsImtpZCI6Ijg1ODI4YzU5Mjg0YTY5YjU0YjI3(这个IdToken比较长)

SignInCredential.getId()拿到的是账号。

两种方式拿到的数据不同,所以根据需求选择方式。

好了,齐活。

🔥 小结

不管是授权登录还是一键登录都需要使用Web客户端ID才能成功,曾经因为使用 Android 客户端ID测试(失败),咨询过谷歌客服,他们直接推荐用使用Web方式登入,原因也没说,可能是因为设定?

🔥 传送门

💥 官方文档

💥 API 控制台