首页 文章

新的Google登录Android

提问于
浏览
78

我正在尝试使用新的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

这不是我的情况,因为我已经选择了一个帐户 . 任何想法可能是什么原因?

30 回答

  • 0

    使用 Web application 作为server_client_id而不是Android应用程序

  • 2

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

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

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

    然后,它又说再次创建一个OAuth 2.0客户端ID,但是这次它说你必须为 Web application

    这是令人困惑的部分! (至少对我而言)因为我只是为Android OAuth创建了客户端ID,而没有为Web应用程序创建一个新的(我认为文档只是冗余或其他)

    正如它所说的那样,只有这一个,你必须使用它作为方法requestIdToken或requestServerAuthCode的参数 .

    忘记在此方法中使用Android OAuth ID,因为这样您将始终获得丑陋的状态代码响应12501 .

    我认为主要问题是文档对此有点混乱 . 或者也许是因为你必须创建两个OAuth ID这一事实有点奇怪 .

    所以作为总结, you need TWO OAuth IDs, one for android and one for web application, and you have to set each one in the correct place.

  • 2

    我正在努力解决这个问题并浪费了将近一周的时间 .

    This is how I got it worked.

    • 在AndroidStudio中导入项目

    • 为项目创建调试密钥库 .

    • 使用debug keystore为项目创建SHA1签名 .

    • 使用SHA1签名,在Google Developer Console上注册Google Signin应用 .

    • 在那里生成一个Google配置文件 . (放入Android Studio的app文件夹)

    • 在Android项目中使用OAuth 2.0凭据中的Web客户端ID .

    • Now, from Android Studio, generate debug build(APK) of your project.

    • Mount the device in your system -> copy this signed debug version of APK and install it.

    最后三个 steps 6, 7 and 8 ,是你真正需要照顾的 . If you directly run the project then APK is not actually signed with the debug keystore and google does not recognise it at all.

  • 2

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

    requestIdToken(getString(R.string.server_client_id))
    

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

    通常我们使用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"
          }
        }
      ],
    
  • 15

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

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

  • 0

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

    这为我修好了!

  • 1

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

    • here所述创建配置文件(google-services.json)并放入/ app项目目录

    • (如其他答案中所述)使用 requestIdToken 方法的Web应用程序客户端ID .

    • [我的主要问题]如果您在以下调试模式下工作,请为您的应用签名:

    signingConfigs {
    发布 {
    storeFile文件(“myreleasekey.keystore”)
    storePassword“密码”
    keyAlias“MyReleaseKey”
    keyPassword“密码”
    }
    }

    buildTypes {
    发布

    debug

    }

  • 19

    现在我明白了 .

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

    • 在Google Developers Console中为Web应用程序创建OAuth客户端ID,并在 requestIdToken() 中使用它(删除状态代码12501)

    • 如果您为 生产环境 哈希密钥创建了Android OAuth客户端ID,请为您的调试哈希密钥创建新的Android OAuth客户端ID,并将其集成到您的google-services.json中 . (摆脱状态代码12500)

    No longer valid 这是最后一部分:3 . 你不能打电话给 requestIdToken()requestEmail() 一下子 . 至少在我的情况下,我通过删除 requestEmail() 摆脱 Result: Status{statusCode=INTERNAL_ERROR, resolution=null} .

    祝你好运......

  • 0

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

  • 1

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

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


    我的应用程序基于this example(类IdTokenActivity)的Android代码 . 为了使它工作,我还需要integrate Google sign-in进入我的应用程序:

    • 生成了启用了Google登录的json配置文件

    • 将Google插件和依赖项添加到我的gradle文件中

    • 为此应用创建了OAuth客户端ID,并将其保存在我的项目中 server_client_id

  • 2

    你的apk是否处于调试模式?我认为它只适用于签名的apk .

  • 0
    • 按照模棱两可的谷歌文档 .

    • 将google-services.json放到项目目录中

    • 将您的gradle设为https://stackoverflow.com/a/35216421/5886475

    • 在string.xml中设置server_client_id . 这是你的 web client id 不是android客户端

  • 17

    我遇到的问题是我生成的SHA-1和不正确的别名一样 . 别名 MUST BE androiddebugkey . 所以我已将Android OAuth ID放在google-service.json文件中 . 我已将Web客户端ID放入requestIdToken() . 在我的具体情况下,我用 androiddebugkey 别名生成了SHA-1 .

    google-services.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
        }
     ]
    

    Signing part:

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
                    .requestEmail() 
                    .build();
    
  • 2

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

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

  • 8

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

    • 转到菜单工具 - > Firebase

    • 点击将您的应用程序连接到Firebase,一旦连接成功,它将以绿色显示为已连接

    • 点击添加Firebase身份验证到您的应用按钮,它也将变为绿色 .

    注意:拥有大量答案清单肯定证实了一件事 . 谷歌需要更新并保持文档的万无一失 .

  • 2

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

  • 1

    显然首先检查你的释放sha1键是否正确 . 但如果它仍然不起作用并且你使用谷歌播放服务8.4.0(即编译'com.google.android.gms:播放服务: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或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();
    
  • 0

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

  • 112

    在我的情况下,我在Google APIs Console上的 Client ID for Android 的凭据仅包含我发布的签名APK的SHA-1 . Android Studio使用默认的调试密钥库来签署我的调试版本,在这种情况下,调试密钥库SHA-1与Android客户端SHA-1不匹配 . 我的解决方案是使用release keystore简单地签署调试版本 .

    在Android Studio中, Build/Edit Build Types... ,然后选择您的调试版本类型,并确保将签名配置设置为您的版本证书 .

    Signing Config set to release

  • 8

    我遇到了同样的问题和错误 12501 以及上面没有对我不起作用 .

    我的问题是我使用为我生成的谷歌默认网络API . 在创建我自己的web api错误消失后工作正常!

    这些是工作步骤:

    • 首先我创建了SHA1调试密钥并添加到 Firebase 控制台 . 从here创建SHA1 .

    • here创建web api和android OAuth 2.0客户端ID

    • Firebase 控制台生成 google-service.json 并放入app文件夹 .

    • 把这段代码放到 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();
    

    tip 1: 我发现您应该创建Android和Web应用程序客户端ID才能工作 .

    tip 2: 如果你像我一样来自伊朗,你可以从谷歌获得用户不能 AuthWithGoogleauth.signInWithCredential(credential) 中的结果将 fail ,你必须使用一些代理返回true .

    这是github中FireBaseAuthDemo的完整工作源:

    enter image description here

    希望能帮忙

  • 0

    如果您使用 debug keystore 来构建项目,则需要在 Firebase Console 上添加 debug.keystore 的SHA-1指纹 .

    • Firebase Console 上,打开您的项目

    • 转到参数 . 标签 General

    • 在本页末尾,有一个字段要添加 Fingerprint SHA-1

    • 将SHA-1粘贴到控制台字段中 .

    要获取debug.keystore的SHA-1:

    Mac/Linux :

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

    Windows :

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

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

    就这样 !

  • 3

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

    在项目浏览器中,右键单击您的应用程序,然后选择“打开模块设置” .

    Screenshot of Open Module Settings | app | signing | config

    我发现将 .jks 文件放在项目的 /app 目录中并不那么令人困惑 . 无论如何在它上面运行这一行 .

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

    系统将提示您输入密码 . 不确定它是 Key Password 还是 Store Password 因为我的是相同的 . :|

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

  • 1

    这是一个新的 . 我尝试使用来自我公司Google Apps域的ID在模拟器上登录6个小时,但无济于事,收到12501错误 . 在预感,我尝试了我的个人Gmail邮件,它工作 . 如果我用我的公司ID尝试使用手机,也可以 . 事实证明,模拟器没有适当的移动设备管理设置来允许我的公司ID登录 .

    因此,如果我想在具有此公司ID的模拟器上进行测试,我必须安装Google Play商店,然后安装MDM软件并进行配置 .

  • 4

    根据我对此错误的奇怪体验,我可以说您还需要尝试重新启动手机以摆脱此错误:)我使用G Suite帐户实施了Google登录,其中包含通过Google管理员分配的设备政策 . 所以在第一次登录时需要安装Device Policy应用程序 . 完成所有后续步骤后,它只是抛出12501错误 . 同一个应用程序在其他手机上正常工作 . 所以只有重启才有用 . 但帮助

  • 1

    尽管在这个问题中已经存在许多赞成的答案,但我仍然难以理解逻辑 . 所以,我想出了我的研究成果 .

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

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

    关于 OAuth 2.0 client IDs

    • 网络的OAuth(在应用程序中用作 server_client_id

    • OAuth for android(这需要使用正确的 package name 和签名证书指纹 SHA-1 创建) .

    如果要使用不同的密钥库进行调试和发布,则需要使用相应的包名称和SHA-1创建单独的OAuth 2.0客户端ID .

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

    • 导航到您的应用 .

    • 如果您已经拥有适用于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文件 . (生成文件会执行必要的配置步骤) .

  • 0

    请尝试以下步骤:

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
       .requestEmail()  
       .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
       .build();
    
    • 确保您使用的是与Google项目相同的密钥库 . 例如,如果您使用以下命令生成SHA-1密钥
    keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore
    
    • 然后在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证书时使用的相同 .

  • 1

    1.Specify signingConfigs in your gradle file

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

    2.Go to Build Types in Project Structure (in Android Studio) and specify signingConfigs to "config"

    现在 clean 您的项目并再次构建 . 它应该工作 .

    如果上述方法不起作用,则以下是您的最后选择 .
    尝试第一步,构建并检查 . 如果它不起作用,请转到下一步并再次尝试构建 .

    • 构建一个签名的apk(记住密码已检查) .

    • 在签名之前检查密钥库文件的文件名,并在签署apk时放弃(在android studio中) .

    • 在您的设备中安装已签名的apk .

    • 等待五分钟 .

    • 尝试在谷歌唱歌 . 如果仍然12501即将到来等待五分钟 . 这样做会打到gradle sync .

    • 再试一次 . 它应该工作 .

  • 0

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

    从左上角选择您的Android项目

    2

    • 单击“创建凭据 - > OAuth客户端ID - >选择Web应用程序”

    • 单击“确定”

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

    它应该工作正常 .

  • 0

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

    我被删除先前想到的SHA1并创建并设置新的SHA1 . 生成新的google-services.json并设置到我的app目录中我使用了google开发人员代码我的result.isSucces()在运行项目后返回true

    as summary, delete old sha1 and create new sha1 and download new google-services.json

  • 3

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

    • 制作已签名的APK . 要对APK进行签名,请选择用于创建SHA-1的密钥库的现有路径 . 例如 /.android/debug.keystore

    • 给别名:androiddebugkey

    • storepass和keypass:android .

相关问题