新的Google登录Android

uut 发布于 2019-08-01 android 最后更新 2019-08-01 07:36 97 浏览

我正在尝试使用新的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
The sign-in was cancelled by the user. i.e. the user cancelled some of the sign-in resolutions, e.g. account picking or OAuth consent. Constant Value: 12501
这不是我的情况,因为我已经选择了一个帐户。任何想法可能是什么原因?
已邀请:

et_ea

赞同来自:

显然首先检查你的释放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(); 

snihil

赞同来自:

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

要获得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(需要使用正确的包名称和签名证书指纹SHA-1创建。)
If you are using the different keystore for debug & release, you need to create separate OAuth 2.0 client IDs using respective package name & SHA-1.
您可以在此处创建或编辑您的OAuth 2.0 client IDs https://console.developers.google.com/apis/credentials?project=
  1. 导航到您的应用。
  2. 如果您已安装适用于Android的OAuth,请点击其名称&检查包裹名称& SHA-1。
我们可以将同一个密钥库用于debug&通过在全局(本地,而不是内部项目)中保存密钥库详细信息来发布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());
        }
    }
}
Note: If you enabled only Google Sign-In when you generated the configuration file, you need not to add the google-servies.json file in your project.(generating the file performs the necessary configuration steps).

yeum

赞同来自:

请尝试以下步骤:

  1. 克隆以下项目https://github.com/googlesamples/google-services
  2. 按照https://developers.google.com/identity/sign-in/android/start
  3. 中的指南进行操作
  4. 使用网络客户端(由Google服务自动创建)并将其添加到requestIdToken(...)中
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
       .requestEmail()  
       .requestIdToken("YOUR_WEB_API_ID.apps.googleusercontent.com")
       .build();
    
  5. 确保您使用的是添加到Google项目中的相同密钥库。例如,如果您使用以下命令生成SHA-1密钥
    keytool -exportcert -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore    
    
  6. 然后在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证书时使用的相同。

dsed

赞同来自:

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

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

jdolor

赞同来自:

这是一个新的。我尝试使用来自我公司Google Apps域的ID在模拟器上登录6个小时,但无济于事,收到12501错误。在预感,我尝试了我的个人Gmail邮件,它工作。如果我用我的公司ID尝试使用手机,那就同样如此。事实证明,模拟器没有适当的移动设备管理设置来允许我的公司ID登录。 因此,如果我想在具有此公司ID的模拟器上进行测试,我必须安装Google Play商店,然后安装MDM软件并进行配置。

gest

赞同来自:

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

  1. 制作已签名的APK。要对APK进行签名,请选择用于创建SHA-1的密钥库的现有路径。例如/.android/debug.keystore
  2. 给别名:androiddebugkey
  3. storepass和keypass:android。

equi

赞同来自:

就我而言,我在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

psunt

赞同来自:

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

vvelit

赞同来自:

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

requestIdToken(getString(R.string.server_client_id))
R.string.server_client_id为Web应用程序使用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"
      }
    }
  ],

wab

赞同来自:

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

  1. 转到菜单工具 - > Firebase
  2. 点击将您的应用连接到Firebase,一旦连接成功,它将显示为绿色已连接
  3. 点击“将Firebase身份验证添加到您的应用”按钮,它也会变为绿色。
注意:拥有巨大的答案清单肯定证实了一件事。 Google需要更新并保持文档的安全性。

umodi

赞同来自:

  1. 按照模棱两可的谷歌文档。
  2. 将google-services.json放入您的项目目录
  3. 将您的gradle设置为https://stackoverflow.com/a/35216421/5886475
  4. 在string.xml中设置server_client_id。这是您的Web客户端ID而不是android客户端

eomnis

赞同来自:

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

iqui

赞同来自:

我遇到的问题是我生成的SHA-1和不正确的别名一样。 别名必须是androiddebugkey。 所以我已将Android OAuth ID放在我的google-service.json文件中。我已将Web客户端ID放入requestIdToken()。 在我的具体情况下,我用androiddebugkey别名生成了SHA-1。 谷歌-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
    }
 ]
签名部分:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
                .requestEmail() 
                .build(); 

zex

赞同来自:

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

frerum

赞同来自:

我有完全相同的问题,我找到了解决方案。 如果您按照此处找到的文档: 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应用程序创建一个新的(我认为文档只是多余的或者其他东西) 正如它所说的那样,只有这一个,你必须使用它作为方法requestIdToken或requestServerAuthCode的参数。 忘记在此方法中使用Android OAuth ID,因为这样您将始终获得丑陋的状态代码响应12501。 我认为主要的问题是文档有点令人困惑。或者也许是因为您必须创建两个OAuth ID这一事实有点奇怪。 因此,作为摘要,您需要两个OAuth ID,一个用于android,一个用于Web应用程序,您必须将每个ID设置在正确的位置。

kaut

赞同来自:

我遇到了同样的问题和错误12501以及上面没有对我不起作用。 我的问题是我使用为我生成的谷歌默认网络API。创建自己的网络api错误消失后工作正常! 这些是工作步骤:

  1. 首先我创建了SHA1调试密钥并添加到Firebase控制台。从here创建SHA1。
  2. here创建web api和android OAuth 2.0客户端ID
  3. 从Firebase控制台生成google-service.json并放入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:如果您像我一样来自伊朗,您可以从谷歌获取用户,但您不能AuthWithGoogleauth.signInWithCredential(credential)中的结果将是fail,您必须使用一些代理才能返回true。 这是github中FireBaseAuthDemo的完整工作源: enter image description here 希望有所帮助

taut

赞同来自:

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 sync。
  6. 再试一次。它应该工作。

lnulla

赞同来自:

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

  1. 转到Google API Credentials 从左上角选择您的Android项目 2
  2. 单击“创建凭据” - >“OAuth客户端ID” - >“选择Web” 应用
  3. 点击确定
  4. 现在,如果您已将Android Studio与Firebase同步(已登录) 只是重建项目否则下载更新 google-services.json文件并替换现有文件。 它应该可以正常工作。

nrerum

赞同来自:

现在我懂了。 首先,你必须按照上面的答案说: 1.在Google Developers Console中为Web应用程序创建OAuth客户端ID,并在requestIdToken()中使用它 (摆脱状态代码12501) 2.如果您为生产哈希密钥创建了Android OAuth客户端ID,请为您的调试哈希密钥创建一个新的Android OAuth客户端ID,并将其集成到您的google-services.json中。 (摆脱状态代码12500) 这是最后一部分: 3.您不能立即拨打requestIdToken()requestEmail()。至少在我的情况下,我通过删除requestEmail()摆脱了Result: Status{statusCode=INTERNAL_ERROR, resolution=null}。 祝你好运......

oqui

赞同来自:

在我的情况下,我还必须检查调试SHA-1是否已添加为有效的OAuth Android客户端。

tut

赞同来自:

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

  1. I was made to delete the SHA1 previously thought and create and set new SHA1.
  2. generate new google-services.json and set into my app directory
  3. I was use exactly google developer codes
  4. my result.isSucces() returned true after running the project
作为总结,删除旧的sha1并创建新的sha1并下载新的google-services.json

wsint

赞同来自:

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

  1. 在Firebase控制台上,打开您的项目
  2. 转到参数。标签一般
  3. 在本页末尾,有一个添加指纹SHA-1
  4. 的字段
  5. 将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 就这样 !

jeum

赞同来自:

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

daut

赞同来自:

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

wearum

赞同来自:

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

  1. 按照here所述创建配置文件(google-services.json)并放入/ app项目目录
  2. (如其他答案中所述)使用requestIdToken方法的Web应用程序客户端ID。
  3. [我的主要问题]如果您使用下面的调试模式,请为您的应用签名:
 signingConfigs {
    release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
    }
 }
buildTypes {
     release {
         ...
     }
     debug {
         ...
         signingConfig signingConfigs.release
     }
 }

uqui

赞同来自:

代替R.string.server_client_id,只需使用R.string.default_web_client_id即可。 将google-services.json文件复制到应用程序时,会自动创建此字符串值。您无需将密钥从google-services.json复制到string.xml 它对我有用。

dsit

赞同来自:

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

xet

赞同来自:

我有同样的问题,我注意到当我的server_client_id包含一些不正确的值时,返回了12501代码。 由于没有详细的消息,并且此错误代码的文档相当差,我不知道您的问题是否与我的问题相同。


我的应用程序基于this example(类IdTokenActivity)的Android代码。 为了使它工作,我还需要integrate Google sign-in到我的应用程序:
  • 生成启用了Google登录的json配置文件
  • 将Google插件和相关性添加到我的gradle文件
  • 为此应用创建了OAuth客户端ID,并将其作为server_client_id
  • 保存在我的项目中

xipsam

赞同来自:

我正在努力解决这个问题并浪费了将近一周的时间。 这就是我的工作方式。

  1. 在AndroidStudio中导入项目
  2. 为项目创建调试密钥库。
  3. 使用debug keystore为项目创建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根本无法识别它。

asaepe

赞同来自:

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

On the project browser, right click on your app and select Open Module Settings.
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下的相应密钥凭据中。