新しいGoogle Play Services 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
すでにアカウントを選択しているので、それは私の場合ではありません。理由は何でしょうか?
私はまったく同じ問題を抱えていて、解決策を見つけました。
ここにあるドキュメントに従う場合: 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を作成していないためです(ドキュメントは単に冗長または何か)
それが言うように、それはこれであり、メソッドのパラメータとして使用する必要があるのはこれだけですrequestIdTokenまたはrequestServerAuthCode。
このメソッドでAndroid OAuth IDを使用するのを忘れてください。そうすると、allいステータスコードが12501の応答を常に取得するからです。
主な問題は、ドキュメントがこれについて少し混乱していることだと思います。または、2つのOAuth IDを作成する必要があるという事実が少し奇妙だからかもしれません。
要約すると、2つのOAuth IDが必要です。1つはAndroid用、もう1つはWebアプリケーション用で、それぞれに設定する必要があります正しい場所
私はこれに苦労し、その中でほぼ1週間無駄にしました。
これは私がそれを機能させた方法です
最後の3つステップ6、7、8は、実際に処理する必要があるものです。 プロジェクトを直接実行した場合、APKはデバッグキーストアで実際に署名されず、Googleはそれをまったく認識しません。
私は同じ問題を抱えていました。調査ソリューションの後、server_client_idに誤った値が含まれているか、またはgoogle_services.jsonにキーストアに登録されたclient_idのoauth_clientが含まれていなかったことが再開されました。
requestIdToken(getString(R.string.server_client_id))
R.string.server_client_id
use OAuth -Webアプリケーションの2.0クライアントID。 OAuth Android google_services.jsonで使用するためのクライアントID
通常、2つのキーストアを使用します。1つはデバッグキーストアを使用し、1つは公開用の署名付きキーストアを使用します。したがって、デバッグおよび公開モードで必要な場合は、OAuthクライアントIDをAndroidに2回登録します。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"
}
}
],
私は同じ問題を抱えていました、それはアプリケーションタイプAndroidのクライアントIDを作成したためでした
代わりに、それを削除し、WebアプリケーションタイプのクライアントIDを作成し、この問題を取り除きました。
これを解決する方法を見つけてください...アプリのデバッグバージョンを実行しようとしたときにこのエラーが発生しました...修正するには、開発者コンソールとgoogle-servicesでデバッグアプリの資格情報を追加します.json。
これは私のためにそれを修正しました!
私は同じ問題を抱えていて、次の解決策で解決しました:
requestIdToken
メソッドにWebアプリケーションクライアントIDを使用します。signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... } debug { ... signingConfig signingConfigs.release } }
わかった。
だから、最初に言って上の答えに従う必要があります:
requestIdToken()
で使用します(ステータスコード12501を取り除きます)もはや有効ではありませんそして最後のパートがあります:3. requestIdToken()
とrequestEmail()
を一度に呼び出すことはできません。少なくとも私の場合、requestEmail()
を削除することでResult: Status{statusCode=INTERNAL_ERROR, resolution=null}
を取り除きました。
とても幸運...
Androidアプリケーションではなく、server_client_idとしてWebアプリケーションを使用します
私の場合、デバッグSHA-1が有効なOAuth Androidクライアントとして追加されたことも確認する必要がありました。
同じ問題が発生し、server_client_id
に誤った値が含まれている場合に12501コードが返されることに気付きました。
詳細なメッセージはなく、このエラーコードのドキュメントはかなり貧弱なので、問題の原因が私のものと同じかどうかはわかりません。
私のアプリケーションは この例 (クラスIdTokenActivity)からのAndroidコードに基づいています。動作させるには、アプリに Googleサインインを統合 する必要もありました。
server_client_id
として保存しましたR.string.server_client_id
の代わりに、R.string.default_web_client_id
を使用します。
google-services.jsonファイルをアプリにコピーすると、この文字列値が自動的に作成されます。キーをgoogle-services.jsonからstring.xmlにコピーする必要はありません。
Apkはデバッグモードですか?私はそれが署名されたAPKでのみ動作すると思います。
グラドルを https://stackoverflow.com/a/35216421/5886475 として設定します
String.xmlでserver_client_idを設定します。これはWebクライアントID Androidクライアントではありません
Android StudioでFirebase Supportをクリックすることでこの問題を解決しましたが、これはFirebase以外のユーザーには関係ない場合があります。
注:これに答えの膨大なリストがあることは、一つのことを確実に確認します。 Googleはドキュメントを更新して、だまされないようにする必要があります。
私が抱えていた問題は、間違ったエイリアスと同様に生成した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
}
]
署名部分:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken("WEB CLIEND ID......apps.googleusercontent.com")
.requestEmail()
.build();
debug keystoreを使用してプロジェクトをビルドしている場合、debugのSHA-1フィンガープリントを追加する必要があります.keystoreonFirebase Console.
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
それで全部です !
理由はわかりませんが、Android studioのSHA1は自動的に変更されるため、このエラーが発生します。これを解決するために、Firebaseプロジェクト設定のSHA1をAndroidスタジオの新しいSHA1で更新し、再び機能し始めました。
同じ問題とエラー12501がありましたが、上記のいずれも機能しません。
私の問題は、私のために生成されたgoogle Default web apiを使用していたことです。独自のWeb APIエラーを作成した後、消えて正常に動作しました!
これらは作業手順です。
google-service.json
を取得し、アプリフォルダーに入れます。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:私のようなイランからの場合、Googleからユーザーを取得できますが、AuthWithGoogle
を実行できず、結果はauth.signInWithCredential(credential)
でfail
になり、使用する必要がありましたtrueを返すためのプロキシ。
これはgithubのFireBaseAuthDemoの完全なソースです:
完全に役立つことを願って
上記のオプションのいずれも機能しない場合は、アプリbuild.gradleのapplicationIdがパッケージ名と同じかどうかを確認してください。
私の場合、 Google APIコンソール のClient ID for Android
の認証情報には、リリース署名済みAPKのSHA-1のみが含まれていました。 Android Studioは、デバッグビルドに署名するためにdefaultデバッグキーストアを使用していました。その場合、デバッグキーストアSHA-1はnotAndroidクライアントSHA-1オンラインと一致しません。私の解決策は、リリースキーストアでデバッグビルドに単純に署名することでした。
Android StudioのBuild/Edit Build Types...
で、デバッグビルドタイプを選択し、Signing Configがリリース証明書に設定されていることを確認します。
明らかに、最初にリリースsha1キーが正しいかどうかを確認してください。それでも動作しない場合、Google Play Services 8.4.0(i.e.compile '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();
この質問にはすでに多くの賛成の答えがありますが、論理を理解するのに苦労しました。それで、私は自分の研究を思いつきます。
SHA-1を取得するには、ターミナルでこれを実行します。
keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v
OAuth 2.0 client IDs
について
server_client_id
として使用されます)デバッグとリリースに異なるキーストアを使用している場合は、それぞれのパッケージ名を使用して個別の
OAuth 2.0 client IDs
を作成する必要があります&SHA-1 。
ここでOAuth 2.0 client IDs
を作成または編集できます https://console.developers.google.com/apis/credentials?project=
グローバル(プロジェクト内ではなく、ローカル)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
ファイルを追加する必要はありません(ファイルを生成すると、必要な構成手順が実行されます)。
私も同じ問題を抱えています。次のように解決しました。
以前考えていたSHA1を削除し、新しいSHA1を作成して設定するようになりました。
新しい
google-services.json
を生成し、アプリディレクトリに設定します私は正確に使用していました google開発者コード
プロジェクトの実行後に
result.isSucces()
がtrueを返しました
要約として、古いsha1を削除して新しいsha1を作成し、新しいgoogle-services.jsonをダウンロードします
次の手順を試してください。
次のプロジェクトを複製します https://github.com/googlesamples/google-services
https://developers.google.com/identity/sign-in/Android/start のガイドに従ってください
Webクライアント(Googleサービスにより自動作成)を使用し、requestIdToken(...)に追加します
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証明書の生成中に使用したものと同じでなければなりません。
これが新しいものです。会社のGoogle AppsドメインからのIDを使用してエミュレータにログインしようとして6時間試行しましたが、何の効果もなく、12501エラーが発生しました。思い切って、私は自分のGmail IDを試しましたが、うまくいきました。企業IDを使用して電話で試した場合も同様です。エミュレーターには、企業IDがログインできる適切なモバイルデバイス管理設定がありませんでした。
したがって、この企業IDを使用してエミュレーターでテストする場合は、Google PlayストアをインストールしてからMDMソフトウェアをインストールし、構成する必要があります。
アプリはWebビューからGoogleサインインを要求するため、Webアプリケーション認証クライアントID v2.0を作成する必要があります
Google API Credentials に移動します
左上隅からAndroidプロジェクトを選択します
[資格情報の作成]-> OAuthクライアントID-> Webアプリケーションの選択をクリックします。
OKをクリック
Android StudioをFirebase(ログイン)と同期している場合は、プロジェクトを再構築するだけです。そうでない場合は、更新されたgoogle-services.jsonファイルをダウンロードして、既存のファイルを置き換えます。
正常に動作するはずです。
1.gradleファイルでsigningConfigsを指定
signingConfigs {
config {
keyAlias 'appalias'
keyPassword 'hunter123'
storePassword 'hunter123'
storeFile file('path/to/keystore.jks')
}
}
2。プロジェクト構造(Android Studio内)のビルドタイプに移動し、signingConfigsを「config」に指定します
ここでcleanプロジェクトを再構築します。動作するはずです。
上記が機能しない場合は、以下が最後の手段です。
ステップ1を試し、ビルドして確認します。動作しない場合は、次の手順に進んで、もう一度ビルドしてみてください。
同じ12501 status
エラーに直面していました。これは、リリースAPKとデバッグAPKのSHA-1の不一致が原因です。
/.Android/debug.keystore
このエラーの奇妙な経験から、このエラーを取り除くために携帯電話を再起動する必要もあると言えます:) 。そのため、最初のサインインでは、Device Policyアプリのインストールが必要でした。後のすべての手順が完了した後、12501エラーがスローされました。同じアプリが他の携帯電話でも正常に機能していました。したがって、再起動のみが役立ちました。しかし、助けた
アプリに自動的に署名する のGoogleの指示に従った後、私もこの問題を抱えていました。この方法を使用してアプリに署名する場合、生成されたキーストアフィンガープリントをAPI資格情報に含める必要があります。
プロジェクトブラウザで、アプリを右クリックし、[モジュール設定を開く]を選択します。
.jks
ファイルをプロジェクトの/app
ディレクトリに置くと、混乱が少なくなります。いずれにせよ、この行を実行してください。
keytool -list -v -keystore /home/user/keystores/Android.jks
パスワードの入力を求められます。私のものは同じであるため、それがKey Password
かStore Password
かどうかはわかりません。 :|
コンソールは、証明書の指紋の束を吐き出します。 SHA1を受け取り、 Google API Developer's Console でAPI資格情報にパンチします。アプリで実際にclient_idを使用していなくても、AndroidクライアントOAuth 2.0 client IDs
に入力する必要があります。 Android用の他のAPIを使用している場合は、API keys
の下の適切なキー資格情報にも同じSHA1を入れます。
わずか数行のコードでアプリにGoogle SignInオプションを追加するlibを開発しました。お試しください HiGoogle- Google SignIn Made Easy
Androidアプリケーションではなく、server_client_idとしてWebアプリケーションを使用します。 HiGoogleコンストラクターに渡します。