79

我正在尝试使用新的 Google Play 服务 8.3 获取用户令牌 ID,据记录,我传递了服务器 ID:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
    .requestIdToken(getString(R.string.server_client_id))
    .requestEmail()
    .build();

但我仍然没有成功的结果如下:

{statusCode=unknown status code: 12501, resolution=null}

并记录在这里GoogleSignInStatusCodes

用户取消了登录。即用户取消了一些登录解决方案,例如帐户选择或 OAuth 同意。

常数值:12501

那不是我的情况,因为我已经选择了一个帐户。知道可能是什么原因吗?

4

32 回答 32

115

我遇到了完全相同的问题,我找到了解决方案。

如果您遵循此处找到的文档: https ://developers.google.com/identity/sign-in/android/start-integrating

第一步告诉您创建配置文件(为您创建 OAuth 2.0 客户端 ID 并将其插入到 google-services.json 中)

稍后,它再次说要创建 OAuth 2.0 客户端 ID,但这次它说您必须为Web 应用程序执行此操作

这是令人困惑的部分!(至少对我而言)因为我只是获取为 android OAuth 创建的客户端 ID,而不是为 Web 应用程序创建一个新的客户端 ID(我认为文档只是多余的东西)

正如它所说,就是这个,只有这个是您必须用作方法requestIdTokenrequestServerAuthCode的参数的那个。

忘记在此方法中使用 Android OAuth ID,因为那样您将一直收到丑陋的状态码响应 12501。

我认为主要问题是文档对此有点混乱。或者可能是因为您必须创建两个 OAuth ID 的事实有点奇怪。

总而言之,您需要两个 OAuth ID,一个用于 android,一个用于 Web 应用程序,您必须将每一个设置在正确的位置。

于 2015-11-13T09:08:39.583 回答
20

我为此苦苦挣扎,并在其中浪费了将近一个星期。

这就是我的工作方式。

  1. 在 AndroidStudio 中导入项目
  2. 为项目创建调试密钥库。
  3. 使用调试密钥库为项目创建 SHA1 签名。
  4. 使用 SHA1 签名,在 Google Developer Console 上为您的应用注册 Google Signin。
  5. 在那里生成一个 Google 配置文件。(放在 Android Studio 的 app 文件夹中)
  6. 在您的 Android 项目中使用来自 OAuth 2.0 凭据的 Web 客户端 ID。
  7. 现在,从 Android Studio 生成项目的调试版本(APK)。
  8. 在您的系统中安装设备 -> 复制此签名的 APK 调试版本并安装它。

最后三个步骤 6、7 和 8是您真正需要注意的。如果您直接运行该项目,那么 APK 实际上并未使用调试密钥库进行签名,并且 google 根本无法识别它。

于 2016-06-06T12:49:10.537 回答
17

我遇到了同样的问题,在研究解决方案后,它恢复了 server_client_id 包含一些不正确的值,或者您的 google_services.json 没有包含在您的密钥库中注册的带有 client_id 的 oauth_client。

requestIdToken(getString(R.string.server_client_id))

R.string.server_client_id对Web Application使用 OAuth 2.0 客户端 ID 。在 google_services.json 中使用Android的OAuth 客户端 ID

通常我们使用 2 个密钥库,1 个使用调试密钥库,1 个使用签名密钥库进行发布。因此,如果我们需要调试和发布模式,请为 Android 注册您的 OAuth 客户端 ID 两次,1 次使用来自调试密钥库的 SHA1,1 次来自签名密钥库以进行发布。

我的 google_services.json 中的小例子

  "oauth_client": [
    {
      "client_id": "xxx-client-id.com",
      "client_type": 1,
      "android_info": {
        "package_name": "com.app.android",
        "certificate_hash": "xxxhash"
      }
    },
    {
      "client_id": "yyy.client-id.com",
      "client_type": 1,
      "android_info": {
        "package_name": "com.app.android",
        "certificate_hash": "yyyhash"
      }
    }
  ],
于 2015-11-15T17:23:49.113 回答
15

我遇到了同样的问题,这是因为我创建了应用程序类型 Android 的客户端 ID

相反,我删除了它并创建了 Web 应用程序类型的客户端 ID,我摆脱了这个问题。

于 2015-11-13T12:06:14.220 回答
8

我有同样的问题,我用以下解决方案解决了:

  1. 如此处所述创建配置文件 (google-services.json)并放置在您/app 项目目录中
  2. (如其他答案中所述)将Web应用程序客户端ID用于requestIdToken方法。
  3. [我的主要问题] 如果您在调试模式下工作,请签署您的应用程序,如下所示:
 signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
 }

 buildTypes {
     release {
         ...
     }
     debug {
         ...
         signingConfig signingConfigs.release
     }
 }
于 2016-05-10T09:33:24.457 回答
8

只需弄清楚如何解决这个问题...我在尝试运行我的应用程序的调试版本时遇到此错误...要修复它,请在开发人员控制台和 google-services 上为您的调试应用程序添加凭据.json。

这为我修好了!

于 2015-11-12T20:49:35.230 回答
4

现在我知道了。

所以首先你必须按照上面的答案说:

  1. 在 Google Developers Console 中为 Web 应用程序创建 OAuth 客户端 ID 并将其用于requestIdToken() (摆脱状态码 12501)
  2. 如果您为生产哈希密钥创建了一个 Android OAuth 客户端 ID,请为您的调试哈希密钥创建一个新的 Android OAuth 客户端 ID,并将其集成到您的 google-services.json 中。(去掉状态码 12500)

不再有效 这里是最后一部分: 3. 你不能调用requestIdToken()requestEmail()一次。至少在我的情况下,我Result: Status{statusCode=INTERNAL_ERROR, resolution=null}通过删除摆脱了requestEmail().

那么祝你好运...

于 2016-01-22T23:42:52.560 回答
3

就我而言,我还必须检查调试 SHA-1 是否已添加为有效的 OAuth Android 客户端。

于 2015-12-04T23:15:07.850 回答
3

Web 应用程序用作 server_client_id 而不是 Android 应用程序

于 2016-04-13T20:06:38.080 回答
2

您的 apk 是否处于调试模式?我认为它仅适用于已签名的 apk。

于 2015-11-09T22:48:23.967 回答
2

我遇到了同样的问题,我注意到当我server_client_id包含一些不正确的值时返回了 12501 代码。

由于没有详细的消息,并且此错误代码的文档很差,我不知道您的问题是否与我的问题相同。


我的应用程序基于此示例中的 Android 代码(IdTokenActivity 类)。为了使它工作,我还需要将 Google 登录集成到我的应用程序中:

  • 生成的启用 Google 登录的 json 配置文件
  • 将 Google 插件和依赖项添加到我的 gradle 文件中
  • 为此应用创建了 OAuth 客户端 ID,并将其保存在我的项目中server_client_id
于 2015-11-09T14:37:36.027 回答
2

我遇到的一个问题是我生成的 SHA-1 使用了不正确的别名。别名必须是 androiddebugkey。因此,我将 Android OAuth ID 放在了我的google-service.json文件中。我已将 Web 客户端 ID 放入requestIdToken()。在我的具体情况下,我使用androiddebugkey别名生成了 SHA-1。

谷歌服务.json

"oauth_client": [
    {
      "client_id": "ANDROID OAUTH ID-.....apps.googleusercontent.com",
      "client_type": 1,
      "android_info": {
        "package_name": "br.com.packagename",
        "certificate_hash": "SHA-1 HASH"
      }
    },{
      "client_id": "WEB CLIEND ID......apps.googleusercontent.com",
      "client_type": 3
    }
 ]

签约部分:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
                .requestEmail() 
                .build(); 
于 2016-11-09T22:29:14.583 回答
2

我通过单击 Android Studio 中的 Firebase 支持解决了这个问题,这可能与非 Firebase 用户无关。

  1. 转到菜单工具-> Firebase
  2. 点击将您的应用连接到 Firebase,一旦连接成功,它将显示为绿色已连接
  3. 点击 Add Firebase Authentication to your app 按钮,它也会变成绿色。

注意:在此拥有大量答案肯定会证实一件事。谷歌需要更新并保持文档万无一失。

于 2017-02-01T12:00:53.583 回答
2
  1. 按照模棱两可的谷歌文档。
  2. 将 google-services.json 放到你的项目目录中
  3. 将您的 gradle 设置为https://stackoverflow.com/a/35216421/5886475

  4. 在 string.xml 中设置 server_client_id 。这是您的Web 客户端 ID ,而不是 android 客户端

于 2016-02-05T05:14:41.953 回答
2

代替R.string.server_client_id,只需使用R.string.default_web_client_id.

当您将google-services.json文件复制到应用程序中时,它会自动创建此字符串值。您不需要将密钥从 google-services.json 复制到 string.xml 它对我有用。

于 2016-12-02T07:32:59.183 回答
1

显然首先检查您的发布 sha1 密钥是否正确。但是,如果它仍然无法正常工作并且您使用的是 google play services 8.4.0(即编译 'com.google.android.gms:play-services:8.4.0'),则可以通过修改 GoogleSignInOption 对象来解决该问题。代替:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestEmail()  
       .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
                    .build();

你必须使用:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestScopes(new Scope(Scopes.PLUS_LOGIN))
                .requestScopes(new Scope(Scopes.PLUS_ME))
                .requestEmail()
                .build();

这解决了返回 statusCode=INTERNAL_ERROR OR statusCode=Error 12501 OR statusCode=Error 12500 的错误。然后此 gso 对象可用于创建 GoogleApiClient,如下所示:

 mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API,gso)
               // .addApi(Plus.API, null)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
               // .addScope(Plus.SCOPE_PLUS_LOGIN)
                .build(); 
于 2016-04-12T14:17:54.187 回答
1

就我而言,我Client ID for AndroidGoogle APIs Console上的 Credentials仅包含我的发布签名 APK的 SHA-1 。Android Studio 使用默认调试密钥库来签署我的调试版本,在这种情况下,调试密钥库 SHA-1与在线的 Android 客户端 SHA-1不匹配。我的解决方案是简单地使用发布密钥库对调试版本进行签名。

在 Android Studio 中Build/Edit Build Types...,选择您的调试构建类型并确保将 Signing Config 设置为您的发布证书。

签名配置设置为发布

于 2016-11-15T16:46:51.110 回答
1

如果您使用调试密钥库构建项目,则需要在Firebase 控制台上添加debug.keystore的 SHA-1 指纹。

  1. 在您的Firebase 控制台上,打开您的项目
  2. 转到参数。选项卡常规
  3. 在本页末尾,有一个字段可以添加指纹 SHA-1
  4. 将 SHA-1 粘贴到控制台字段中。

获取 debug.keystore 的 SHA-1:

Mac/Linux :

keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

窗户:

 keytool -exportcert -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore

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

就这样 !

于 2017-05-05T14:15:40.270 回答
1

尝试按照以下步骤操作:

  1. 克隆以下项目https://github.com/googlesamples/google-services

  2. 按照https://developers.google.com/identity/sign-in/android/start上的指南进行操作

  3. 使用 Web 客户端(由 Google 服务自动创建)并将其添加到 requestIdToken(...)

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
       .requestEmail()  
       .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
       .build();
    
  4. 确保您使用的是添加到 Google 项目中的相同密钥库。例如,如果您使用以下命令生成 SHA-1 密钥

    keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore    
    
  5. 然后在 android { ... } 内的 app/build.gradle 文件中添加以下代码 [解决了我的问题]

    signingConfigs
    {
        debug 
        {
            storeFile file("/home/ashwin/.android/debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }
    
    buildTypes
    {
        release
        {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug
        {
            signingConfig signingConfigs.debug
        }
    }
    

注意:您的 keyPassword 和 keyAlias 应该与生成 SHA-1 证书时使用的相同。

于 2017-01-27T13:50:17.810 回答
1

我遇到了同样的问题和错误12501,上面没有对我有用。

我的问题是我使用为我生成的谷歌默认 web api 。创建我自己的 web api 错误后消失并且工作正常!

这些是工作步骤:

  1. 首先我创建了 SHA1 调试密钥并添加到Firebase控制台。从这里创建 SHA1 。
  2. 从这里创建 web api 和 android OAuth 2.0 客户端 ID
  3. google-service.jsonFirebase控制台生成并放入 app 文件夹。
  4. 将此代码用于GoogleSignnOption

像这样:

gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestIdToken
                ("put the web app client Id that get from the link in developer console ")
                .requestEmail().build();

提示 1:我发现您应该创建 android 和 web 应用程序客户端 ID 才能工作。

提示 2:如果你像我一样来自伊朗,你可以从谷歌获取用户,但你不能AuthWithGoogle,结果会failauth.signInWithCredential(credential)你必须使用一些代理来返回 true。

这是 github 中 FireBaseAuthDemo 的完整源代码:

在此处输入图像描述

希望帮助满

于 2017-01-01T06:13:36.893 回答
1

如果以上选项都不起作用,请检查您在 app build.gradle 中的 applicationId 是否与您的包名称相同。

于 2015-11-19T14:18:33.200 回答
1

不知道为什么,但是 android studio 中的 SHA1 会自动更改,这就是我收到此错误的原因。为了解决这个问题,我用我的 android studio 的新 SHA1 更新了我的 firebase 项目设置的 SHA1,它又开始工作了。

于 2016-09-15T19:00:18.187 回答
0

尽管在这个问题中已经存在很多赞成的答案,但我很难理解其中的逻辑。所以,我提出了我的研究。

要获取 SHA-1,请在终端中运行:

keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v

关于OAuth 2.0 client IDs

  • 网络 OAuth(在应用程序中用作server_client_id
  • 适用于 android 的 OAuth(这需要使用正确的包名称和签名证书指纹SHA-1创建)。

如果您使用不同的密钥库进行调试和发布,则需要OAuth 2.0 client IDs使用各自的包名称SHA-1创建单独的密钥库。

您可以在OAuth 2.0 client IDs此处 创建或编辑您的https://console.developers.google.com/apis/credentials?project=

  1. 导航到您的应用程序。
  2. 如果您已经拥有适用于 Android 的 OAuth,请单击其名称并检查包名称SHA-1

我们可以通过将密钥库详细信息保存在全局(本地,而不是项目内部)中并按如下方式gradle.properties获取它来为调试和发布使用相同的密钥库。build.gradle

def key_alias = ""
def key_password = ""
def store_file = ""
def store_password = ""

try {
    key_alias = YOUR_KEY_ALIAS
    key_password = YOUR_KEY_PASSWORD
    store_file = YOUR_KEYSTORE_PATH
    store_password = YOUR_KEYSTORE_PASSWORD
} catch (Exception exception) {
    throw new IllegalStateException('Failed to find key store details. Social Login is disabled');
}

android {
    signingConfigs {
        config {
            keyAlias key_alias
            keyPassword key_password
            storeFile file(store_file)
            storePassword store_password
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.config
            // ...
        }
        release {
            signingConfig signingConfigs.config
            // ...
        }
    }
}

您可以使用以下代码段

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) {
        GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (result.isSuccess()) {
            // ...
        } else if (result.getStatus().getStatusCode() == CommonStatusCodes.NETWORK_ERROR) {
            // No internet connection
        } else if (result.getStatus().getStatusCode() == CommonStatusCodes.DEVELOPER_ERROR) {
            // Wrong server OAuth key(server_client_id)
        } else if (result.getStatus().getStatusCode() == 12501) {
            // Wrong app signing-certificate fingerprint SHA1
        } else {
            Log.e("Google sign in error", result.getStatus().toString());
        }
    }
}

注意:如果您在生成配置文件时仅启用了 Google 登录,则无需google-servies.json在项目中添加该文件。(生成文件执行必要的配置步骤)。

于 2016-12-28T10:17:57.337 回答
0

我已经开发了 lib 以在您的应用程序中添加 Google 登录选项,只需几行代码。试用HiGoogle - 轻松登录 Google

Web 应用程序用作 server_client_id 而不是 Android 应用程序。在 HiGoogle 构造函数中传递它。

于 2017-12-10T04:15:16.310 回答
0

这是一个新的。我尝试使用公司 Google Apps 域中的 id 登录模拟器 6 小时,但无济于事,出现 12501 错误。凭直觉,我尝试了我的个人 gmail id,它成功了。如果我用我的公司 ID 在手机上尝试,也是如此。事实证明,模拟器没有正确的移动设备管理设置来允许我的公司 ID 登录。

因此,如果我想用这个公司 ID 在模拟器上进行测试,我必须安装 Google Play Store,然后是 MDM 软件,并对其进行配置。

于 2016-10-30T11:30:36.893 回答
0

根据我对这个错误的奇怪经历,我可以说你还需要尝试重新启动手机才能摆脱这个错误:) 我使用 G Suite 帐户实现了 Google 登录,这些帐户具有通过 Google Admin 分配的设备策略. 因此,在第一次登录时,它需要安装 Device Policy 应用程序。完成所有后续步骤后,它只是抛出 12501 错误。同时,同一个应用程序在其他手机上运行良好。所以只有重新启动有帮助。但帮助

于 2016-12-07T05:35:41.977 回答
0

由于应用程序请求 Google 从 Web 视图登录,我们需要创建 Web 应用程序身份验证客户端 ID v2.0

  1. 转到Google API 凭据

    从左上角选择您的 Android 项目

    2

  2. 单击 Create Credentials --> OAuth Client Id --> 选择 Web 应用程序

  3. 点击确定

  4. 现在,如果您已将 Android Studio 与 Firebase 同步(已登录),只需重建项目,否则下载更新 的 google-services.json文件并替换现有文件。

    它应该可以正常工作。

于 2017-04-23T00:11:29.267 回答
0

我也有同样的问题,解决方法如下:

  1. 我被要求删除以前认为的 SHA1,并创建和设置新的 SHA1。

  2. 生成新的google-services.json并设置到我的应用程序目录中

  3. 我使用的是谷歌开发者代码

  4. 运行项目后我result.isSucces()返回 true

作为总结,删除旧的 sha1 并创建新的 sha1 并下载新的 google-services.json

于 2017-04-25T09:09:42.147 回答
0

我面临同样的12501 status错误。这是由于发布 APK 和调试 APK 的 SHA-1 不匹配。

  1. 制作一个签名的 APK。要签署 APK,请选择您用于创建 SHA-1 的密钥库的现有路径。例如/.android/debug.keystore
  2. 给出别名:androiddebugkey
  3. storepass 和 keypass : android.
于 2017-05-27T20:36:32.687 回答
0

1.在你的gradle文件中指定signingConfigs

signingConfigs {
        config {
            keyAlias 'appalias'
            keyPassword 'hunter123'
            storePassword 'hunter123'
            storeFile file('path/to/keystore.jks')
        }
}

2.转到项目结构中的构建类型(在Android Studio中)并将signingConfigs指定为“config”

现在清理您的项目并再次构建。它应该工作。

如果上述方法不起作用,那么下面是您的最后手段。
尝试第一步并构建和检查。如果它不起作用,请转到下一步并尝试再次构建。

  1. 构建一个签名的 apk(检查记住密码)。
  2. 在签名之前检查密钥库文件的文件名以及在签署 apk 时放弃的文件名(在 android studio 中)。
  3. 在您的设备中安装签名的 apk。
  4. 等待五分钟。
  5. 试着用谷歌唱歌。如果还有 12501 来,请再等五分钟。在这样做的同时,命中 gradle 同步。
  6. 再试一次。它应该工作。
于 2017-04-10T12:48:23.470 回答
0

在按照 Google 的Automatically signed your app的说明进行操作后,我也遇到了这个问题。如果您使用此方法对您的应用程序进行签名,则需要将生成的密钥库指纹包含在您的 API 凭据中。

在项目浏览器上,右键单击您的应用并选择打开模块设置。

开放模块设置截图 |  应用 |  签约 |  配置

我发现将.jks文件放在我的项目/app目录中不那么令人困惑。无论如何运行这条线就可以了。

keytool -list -v -keystore /home/user/keystores/android.jks

系统将提示您输入密码。不知道是不是Key Password还是Store Password因为我的是一样的。:|

控制台会吐出一堆证书指纹。在Google API Developer's Console获取 SHA1 并将其打入您的 API 凭据中。OAuth 2.0 client IDs即使您实际上并未在应用程序中使用该 client_id,您也需要为 Android 客户端输入它。如果您正在使用其他适用于 android 的 API,请将相同的 SHA1 放入相应的密钥凭据中API keys

于 2016-03-12T05:29:18.463 回答
-2

我有同样的问题。当我第一次创建 google-services.json 并将 firebase 添加到项目时,我可能没有正确遵循这些步骤,即使在尝试了此处描述的所有步骤之后,我也无法解决问题。我最终通过从 android studio 中连接到 firebase 进行管理,如此处所述。我经历了前两个步骤并再次编译,代码终于工作了。

于 2017-12-03T21:50:57.340 回答