小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。
接入首先咱们看官方文档一键登录的内容。默认你已经能去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方式登入,原因也没说,可能是因为设定?