![](/img/trans.png)
[英]Flutter: Firebase: PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 10: , null)
[英]Google sign in failed com.google.android.gms.common.api.ApiException: 10:
所以我被困在这个令人沮丧的问题上。 我对 Firebase 上的 Google Auth 很陌生,但我完成了 firebase 文档中关于如何集成 Google SignIn Auth 的所有说明,但我仍然在控制台中收到这个奇怪的错误,该错误由两部分组成:
12-03 11:07:40.090 2574-3478/com.google.android.gms E/TokenRequestor: You have wrong OAuth2 related configurations, please check. Detailed error: UNREGISTERED_ON_API_CONSOLE
并且
Google sign in failed com.google.android.gms.common.api.ApiException: 10:
在任何人试图指出以前在堆栈溢出时被问过的类似问题之前,这是我在看到所有可用的解决方案之后到目前为止所做的事情,但尚未解决错误
这是我的代码片段:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
ButterKnife.bind(this);
String webClientId = getString(R.string.web_client_id);
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(webClientId)
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
googleLoginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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 GoogleSignInClient.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
// The Task returned from this call is always completed, no need to attach
// a listener.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try{
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);
// [START_EXCLUDE]
Toast.makeText(this, "Gooogle Auth failed", Toast.LENGTH_LONG);
// [END_EXCLUDE]
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId());
// [START_EXCLUDE silent]
//showProgressDialog();
// [END_EXCLUDE]
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();
Toast.makeText(LoginActivity.this, "Successful Auth", Toast.LENGTH_LONG).show();
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCredential:failure", task.getException());
Toast.makeText(LoginActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
//updateUI(null);
}
// [START_EXCLUDE]
//hideProgressDialog();
// [END_EXCLUDE]
}
});
}
基本上问题出在控制台上的SHA1
密钥中,请重新生成它并再次正确放置相同的项目。
1)作为答案,请确保您实际签名的 Android apk
具有与您在 Firebase 项目的 Android 集成部分(您可以下载google-services.json
的页面)的控制台中指定的相同的SHA1
指纹
有关更多信息,请参阅: 为 Flutter 应用程序生成 SHA-1
2)最重要的是转到您的firebase项目的设置(齿轮图标在左上角区域的概述右侧。然后切换到帐户链接选项卡。在该选项卡上将Google Play链接到您的项目。
编辑:帐户链接选项卡不再存在,而是:
Link
。使用Google Play和Firebase的 App Signing 时,您需要将App 签名证书的 SHA-1 指纹(可在 Google Play 控制台/发布管理/应用签名证书上找到)添加到 Firebase 控制台/设置/SHA 证书指纹
SHA 的更新位置: Google Play Console > Release > Setup > App integrity
就我而言, SHA-1
没有问题
我已经使用Firebase
完成了GoogleAuth
。
我忘了添加implementation 'com.firebaseui:firebase-ui-auth:4.3.1'
我用自己的密钥代替了R.string.default_web_client_id
,所以这就是问题所在。 我添加了上面的依赖项并用我自己的密钥替换R.string.default_web_client_id
。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
更新:2020 年 12 月 18 日
我们也可以在没有requestIdToken
的情况下使用,如下所示。 为此,您必须将 SHA1 添加到谷歌控制台。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
我遇到了同样的问题,在检查了解决方案之后,从重新生成指纹到将 Firebase 上的应用程序链接到 Google Play 控制台并发布签名的 apk,问题实际上是因为我使用的是 SHA-1 版本Firebase 控制台。
https://developer.android.com/studio/publish/app-signing.html
我的解决方案有点不同,
经过数小时尝试各种事情。 我找到了我的解决方案:
使用此处列出的步骤: https ://stackoverflow.com/a/34223470/10575896
控制台将打印出调试和发布的 SHA 密钥。 我在过去的某个时候将调试密钥添加到了 firebase,但我没有添加发布密钥。
我只是将 SHA1 和 SHA256 密钥添加到 firebase,我很高兴。
如果您在 SHA-1 等 Firebase 中的所有配置都有效,并且您已导入正确的 google-services.json 文件,但您仍然收到错误消息,请在 Firebase 控制台中添加支持电子邮件
您必须在 fire base 控制台中添加支持电子邮件转到项目->设置->常规->公共设置添加支持电子邮件
我处理这个问题两天了! 问题是我使用的 clientId 是 android 类型,而我必须使用 web 应用程序类型 Clientid 。 如果您有同样的问题,请考虑这一点;)
我对每个答案都有问题,所以这是对我有用的解决方案:
首先,将 Firebase 添加到您的项目中:
转到Firebase网站 ->添加项目-> 创建新项目后转到添加应用程序并添加您的 Android 应用程序
注意添加确切的包名称并调试 SHA-1 密钥。
您可以在 Android Studio 中执行以下操作生成调试 SHA-1 密钥:
在右侧打开Gradle面板 -> 转到Tasks -> android -> 运行signingReport
您的 SHA-1 密钥将显示在运行窗口中
注册应用程序后,下载配置文件。 在配置 .json 文件中,您可以找到您的client_id : client -> oauth_client -> client_id
注意有两个client_id 。 带有"client_type": 3的那个使用以下代码为我工作:
private fun requestSignIn(context: Context) {
GoogleSignIn.getLastSignedInAccount(context)?.also { account ->
onSignedIn(account)
return
}
val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Scope("https://www.googleapis.com/auth/spreadsheets"))
.requestEmail()
.requestIdToken("client_id_goes_here")
.build()
val client = GoogleSignIn.getClient(context, signInOptions)
startActivityForResult(client.signInIntent, REQUEST_SIGN_IN)
}
然后在onActivityResult中:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_SIGN_IN) {
if( resultCode == RESULT_OK) {
GoogleSignIn.getSignedInAccountFromIntent(data)
.addOnSuccessListener { account ->
onSignedIn(account)
}
.addOnFailureListener { e ->
Log.d("Fail", "Fail")
}
}
}
}
在onSignedIn你应该做 google sheet api 调用
Build
GoogleSignInOptions
时使用.requestIdToken(getString(R.string.default_web_client_id))
:GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
debug.keystore
的 SHA1 和 SHA256 指纹添加到 Firebase 项目:keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
, Windows - keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore
我不确定这是否是原因,但我们可能需要在发布之前在 Android App 中使用 Web Client ID,请阅读以下文章,
https://android-developers.googleblog.com/2016/03/registering-oauth-clients-for-google.html
添加 SHA1 和 SHA256 应用签名证书后,它仍然无法正常工作。 一旦我添加了 SHA1 App 上传证书,它就可以工作了:)
添加 SHA1 和 SHA256 应用签名证书后,它就可以工作了。
现在是 2022 年,我花了 7 个小时调试这个! 我不是原生 Android 开发人员,所以直到现在我才知道是什么。
这是我如何使它工作的。
您正在使用的世界上有 3 种不同的构建/应用程序:
debug
器是您可以附加调试器(错误图标!)的调试器,而release
是您不能附加的调试器。
无论你做什么,确保这些是不同的,否则你会拉扯你的头发,为什么它在这里起作用而不在那里!
我来自我们在发布之前标记和版本的背景。 (例如后端)在这里,如果你这样做,它会搞砸一切! 所以你应该立即标记,然后发布,然后版本更新!
理想情况下,Play 商店应该是1.1.7
,发布版本应该是1.1.8
(是的,提前一个版本,因为它是您要发布的版本),调试版本应该是1.1.8-debug
。
如果您不这样做,并且它们是相同的,Android 操作系统将缓存包/APK。 因此,即使您从 Play 商店安装应用程序,它也可能使用缓存中的 Android Studio 版本,并带有自己的证书! (我花了 4 个小时才知道为什么在两部手机上从 Play 商店安装相同的应用程序会产生不同的行为——其中一个是使用来自 Android Studio USB 版本的缓存 APK。)
在这一点上,您应该知道您应该为 Android 创建一个“Web”OAuth 客户端 ID 以及一个虚拟的 Android 客户端 ID 的疯狂系统! 看到这个。
是的,您需要一个“Web”密钥和一个“Android”密钥才能使用 GoogleSignIn。 您应该几乎在任何地方都使用“Web”(除了进行服务器端令牌验证,您可以在其中验证 JWT 的受众/发行者)。 无论如何,如果没有未使用的虚拟“Android”,它是行不通的。
但是,我不知道的部分是您需要 3 Android + 1 Web!
当您创建 Android OAuth 客户端 ID 时,它会要求提供 SHA-1。
这 3 个应用程序中的每一个都有自己的证书,即 SHA-1。
对于 2 和 3(Android Studio 的release
和debug
),您可以通过此解决方案从 gradle 获取它们。
对于 Play 商店,您必须转到 Play Console > App Integrity > App Signing 并从那里获取“应用签名”证书。 (上传的应该最有可能与您的release
相匹配。)
现在,继续为 Web 创建这 3 个 Android Ouath 客户端 ID + 1,希望 Google SignIn 可以在任何地方使用!
在我在模拟器上工作的情况下,我按照步骤https://stackoverflow.com/a/46767856/6800637 ,除了放入https://console.firebase.google.com projectName/settings/general,我的签名密钥 sha1 和 sha256 我还输入了来自 [debug.keystore] 的密钥 sha1,当您按照上述步骤操作时会显示该密钥
此状态代码表示您提供了未知的服务器客户端 ID。
所以我可以通过在 Android 客户端更改 OAuth 客户端 ID 来解决这个问题:
googleSignInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("web application client id")
.requestEmail()
.build()
在您项目的https://console.developers.google.com/apis/credentials中,您可能需要生成:OAuth 客户端 ID -> Web 应用程序并在您的 Android 应用程序中使用此 Web 应用程序客户端 ID。
我最近在尝试使用 Firebase 使用 google 登录时遇到了这个问题。 我可以通过将 GoogleSignInOptions 中的 requestIdToken 更新为在 google-services.json 文件中作为 client_id 提供的那个来修复它。
这些都是很好的答案,以防其他人试图为一个应用程序拥有多个 firebase 项目,即开发和生产,诀窍是当您想测试生产时,如果您使用 Google,则需要将 APK 上传到 Google Play播放以管理您的应用程序的签名。 我使用了内部测试轨道,然后它开始工作。
您不能只使用调试密钥在设备上安装 APK,因为它与 Firebase 中的生产密钥不匹配。
另一个旁注 - 正如其他人所提到的 - 出于某种原因,您需要使用“网络”OAuth 客户端 ID,而不是 Android OAuth 客户端。 这对谷歌来说是一件非常令人困惑的事情。
尽管教程和配置页面建议从清单文件中获取包名称,但似乎已根据“app/build.gradle”文件中的“applicationId”检查它。
到目前为止,有两个地方可以设置包名:
应用程序/src/main/AndroidManifest.xml
app/build.gradle android.defaultConfig.applicationId
在我的情况下,这两个名字是不同的。 早些时候我在第一个文件中更新了包名,但忘记在 build.gradle 文件中更新。
如果你在颤抖,看看你在哪里初始化你的 GoogleSignIn,对我来说添加 clientId 参数在 iOS 上工作但打破了 android 试试
如果您在 Firebase 中的同一个项目下有多个应用程序,请确保您在正确的 (App)com.xxx.yyy中,与您在 Android Studio 中执行的当前项目匹配。 然后在适当的 (App)com.xxx.yyy 下更改 Firebase 设置中的 sha1 并相应地下载 Json,在项目级别查看apps->build->source 。
如果您没有为您的项目设置 SHA-1/SHA-256 哈希值,则可能会出现这种情况。
我遇到了同样的错误,我通过修复WEB_CLIENT_ID
的值解决了它您可以在以下位置检查值:身份验证 -> 登录方法 -> 提供者(例如:Google) -> Web SDK 配置 -> Web 客户端 ID
如果上述来自其他领域的帮助无法阻止 Google 让您被公司解雇,以下可能对您有所帮助:在 android{} 中编辑文件“build.gradle”(:app),如果缺少,请添加这些文件,更改文件路径, storePassword
, keyAlias
, keyPassword
signingConfigs {
debug {
storeFile file('E:\\keystore.jks')
storePassword '123456'
keyAlias 'key0'
keyPassword '123456'
}
release {
storeFile file('E:\\keystore.jks')
storePassword '123456'
keyAlias 'key0'
keyPassword '123456'
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
}
立即构建/清理项目同步
如果还是不行,运行Debug app
,神奇的会出现
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.