web-dev-qa-db-ja.com

新しいGoogleサインインAndroid

新しい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

すでにアカウントを選択しているので、それは私の場合ではありません。理由は何でしょうか?

78
Jamal

私はまったく同じ問題を抱えていて、解決策を見つけました。

ここにあるドキュメントに従う場合: 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アプリケーション用で、それぞれに設定する必要があります正しい場所

112
Kaizie

私はこれに苦労し、その中でほぼ1週間無駄にしました。

これは私がそれを機能させた方法です

  1. AndroidStudioでプロジェクトをインポートする
  2. プロジェクトのデバッグキーストアを作成します。
  3. デバッグキーストアを使用して、プロジェクトのSHA1署名を作成します。
  4. SHA1署名を使用して、Google Developer ConsoleでGoogleサインイン用にアプリを登録します。
  5. そこでGoogle構成ファイルを生成します(Android St​​udioのアプリフォルダーに配置)
  6. OAuthプロジェクトでAndroid 2.0資格情報のWebクライアントIDを使用します。
  7. 今、Android St​​udioから、プロジェクトのデバッグビルド(APK)を生成します。
  8. システムにデバイスをマウントします->この署名済みデバッグバージョンのAPKをコピーしてインストールします。

最後の3つステップ6、7、8は、実際に処理する必要があるものです。 プロジェクトを直接実行した場合、APKはデバッグキーストアで実際に署名されず、Googleはそれをまったく認識しません。

19
Master

私は同じ問題を抱えていました。調査ソリューションの後、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"
      }
    }
  ],
17
RaditzLawliet

私は同じ問題を抱えていました、それはアプリケーションタイプAndroidのクライアントIDを作成したためでした

代わりに、それを削除し、WebアプリケーションタイプのクライアントIDを作成し、この問題を取り除きました。

15
shekar

これを解決する方法を見つけてください...アプリのデバッグバージョンを実行しようとしたときにこのエラーが発生しました...修正するには、開発者コンソールとgoogle-servicesでデバッグアプリの資格情報を追加します.json。

これは私のためにそれを修正しました!

8
Ramon Canales

私は同じ問題を抱えていて、次の解決策で解決しました:

  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
     }
 }
8

わかった。

だから、最初に言って上の答えに従う必要があります:

  1. google Developers ConsoleでWebアプリケーションのOAuth client-idを作成し、requestIdToken()で使用します(ステータスコード12501を取り除きます)
  2. プロダクションハッシュキー用にAndroid OAuth client-idを作成した場合は、デバッグ用に新しいAndroid OAuth client-idを作成しますキーをハッシュし、google-services.jsonに統合します。 (ステータスコード12500を取り除きます)

もはや有効ではありませんそして最後のパートがあります:3. requestIdToken()requestEmail()を一度に呼び出すことはできません。少なくとも私の場合、requestEmail()を削除することでResult: Status{statusCode=INTERNAL_ERROR, resolution=null}を取り除きました。

とても幸運...

4
cybergen

Androidアプリケーションではなく、server_client_idとしてWebアプリケーションを使用します

3
Ketan Keshri

私の場合、デバッグSHA-1が有効なOAuth Androidクライアントとして追加されたことも確認する必要がありました。

3
willy

同じ問題が発生し、server_client_idに誤った値が含まれている場合に12501コードが返されることに気付きました。

詳細なメッセージはなく、このエラーコードのドキュメントはかなり貧弱なので、問題の原因が私のものと同じかどうかはわかりません。


私のアプリケーションは この例 (クラスIdTokenActivity)からのAndroidコードに基づいています。動作させるには、アプリに Googleサインインを統合 する必要もありました。

  • googleサインインを有効にして生成されたjson設定ファイル
  • googleプラグインと依存関係をgradleファイルに追加しました
  • このアプリのOAuthクライアントIDを作成し、プロジェクトにserver_client_idとして保存しました
2
Usy

R.string.server_client_idの代わりに、R.string.default_web_client_idを使用します。

google-services.jsonファイルをアプリにコピーすると、この文字列値が自動的に作成されます。キーをgoogle-services.jsonからstring.xmlにコピーする必要はありません。

2
Chaitanya Wagle

Apkはデバッグモードですか?私はそれが署名されたAPKでのみ動作すると思います。

2
jacoplane
  1. あいまいなGoogleのドキュメントに従ってください。
  2. Google-services.jsonをプロジェクトディレクトリに配置します
  3. グラドルを https://stackoverflow.com/a/35216421/5886475 として設定します

  4. String.xmlでserver_client_idを設定します。これはWebクライアントID Androidクライアントではありません

2
Peter Kao

Android St​​udioでFirebase Supportをクリックすることでこの問題を解決しましたが、これはFirebase以外のユーザーには関係ない場合があります。

  1. メニューツール-> Firebaseに移動します
  2. [Firebaseにアプリを接続]をクリックします。接続が成功すると、緑色で[接続済み]と表示されます。
  3. [Firebase認証をアプリに追加]ボタンをクリックすると、緑色に変わります。

注:これに答えの膨大なリストがあることは、一つのことを確実に確認します。 Googleはドキュメントを更新して、だまされないようにする必要があります。

2
Gayan Pathirage

私が抱えていた問題は、間違ったエイリアスと同様に生成した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(); 
2
Vitor Braga

debug keystoreを使用してプロジェクトをビルドしている場合、debugのSHA-1フィンガープリントを追加する必要があります.keystoreonFirebase Console.

  1. Firebase Consoleでプロジェクトを開きます
  2. パラメータに移動します。タブ一般
  3. このページの最後に、指紋SHA-1を追加するフィールドがあります
  4. コンソールフィールドに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

それで全部です !

1
Dany Poplawec

理由はわかりませんが、Android studioのSHA1は自動的に変更されるため、このエラーが発生します。これを解決するために、Firebaseプロジェクト設定のSHA1をAndroidスタジオの新しいSHA1で更新し、再び機能し始めました。

1
Rahul Sonone

同じ問題とエラー12501がありましたが、上記のいずれも機能しません。

私の問題は、私のために生成されたgoogle Default web apiを使用していたことです。独自のWeb APIエラーを作成した後、消えて正常に動作しました!

これらは作業手順です。

  1. 最初にSHA1デバッグキーを作成し、Firebaseコンソールに追加します。 here からSHA1を作成します。
  2. here からWeb APIとAndroid OAuth 2.0クライアントIDの両方を作成します
  3. Firebaseコンソールから生成されたgoogle-service.jsonを取得し、アプリフォルダーに入れます。
  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:私のようなイランからの場合、Googleからユーザーを取得できますが、AuthWithGoogleを実行できず、結果はauth.signInWithCredential(credential)failになり、使用する必要がありましたtrueを返すためのプロキシ。

これはgithubのFireBaseAuthDemoの完全なソースです:

enter image description here

完全に役立つことを願って

1
Kenji

上記のオプションのいずれも機能しない場合は、アプリbuild.gradleのapplicationIdがパッケージ名と同じかどうかを確認してください。

1
aashish

私の場合、 Google APIコンソールClient ID for Androidの認証情報には、リリース署名済みAPKのSHA-1のみが含まれていました。 Android St​​udioは、デバッグビルドに署名するためにdefaultデバッグキーストアを使用していました。その場合、デバッグキーストアSHA-1はnotAndroidクライアントSHA-1オンラインと一致しません。私の解決策は、リリースキーストアでデバッグビルドに単純に署名することでした。

Android St​​udioのBuild/Edit Build Types...で、デバッグビルドタイプを選択し、Signing Configがリリース証明書に設定されていることを確認します。

Signing Config set to release

1
aardvarkk

明らかに、最初にリリース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(); 
1
silwalprabin

この質問にはすでに多くの賛成の答えがありますが、論理を理解するのに苦労しました。それで、私は自分の研究を思いつきます。

SHA-1を取得するには、ターミナルでこれを実行します。

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

OAuth 2.0 client IDsについて

  • Web用の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ファイルを追加する必要はありません(ファイルを生成すると、必要な構成手順が実行されます)。

0
Vignesh Sundar

私も同じ問題を抱えています。次のように解決しました。

  1. 以前考えていたSHA1を削除し、新しいSHA1を作成して設定するようになりました。

  2. 新しいgoogle-services.jsonを生成し、アプリディレクトリに設定します

  3. 私は正確に使用していました google開発者コード

  4. プロジェクトの実行後にresult.isSucces()がtrueを返しました

要約として、古いsha1を削除して新しいsha1を作成し、新しいgoogle-services.jsonをダウンロードします

0
Richi

次の手順を試してください。

  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証明書の生成中に使用したものと同じでなければなりません。

0
Ashwin

これが新しいものです。会社のGoogle AppsドメインからのIDを使用してエミュレータにログインしようとして6時間試行しましたが、何の効果もなく、12501エラーが発生しました。思い切って、私は自分のGmail IDを試しましたが、うまくいきました。企業IDを使用して電話で試した場合も同様です。エミュレーターには、企業IDがログインできる適切なモバイルデバイス管理設定がありませんでした。

したがって、この企業IDを使用してエミュレーターでテストする場合は、Google PlayストアをインストールしてからMDMソフトウェアをインストールし、構成する必要があります。

0
Tony BenBrahim

アプリはWebビューからGoogleサインインを要求するため、Webアプリケーション認証クライアントID v2.0を作成する必要があります

  1. Google API Credentials に移動します

    左上隅からAndroidプロジェクトを選択します

    2

  2. [資格情報の作成]-> OAuthクライアントID-> Webアプリケーションの選択をクリックします。

  3. OKをクリック

  4. Android St​​udioをFirebase(ログイン)と同期している場合は、プロジェクトを再構築するだけです。そうでない場合は、更新されたgoogle-services.jsonファイルをダウンロードして、既存のファイルを置き換えます。

    正常に動作するはずです。

0
Prateek

1.gradleファイルでsigningConfigsを指定

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

2。プロジェクト構造(Android St​​udio内)のビルドタイプに移動し、signingConfigsを「config」に指定します

ここでcleanプロジェクトを再構築します。動作するはずです。

上記が機能しない場合は、以下が最後の手段です。
ステップ1を試し、ビルドして確認します。動作しない場合は、次の手順に進んで、もう一度ビルドしてみてください。

  1. 署名済みのapkを作成します(パスワードを記憶してチェックしてください)。
  2. 署名する前に、キーストアファイルのファイル名と、apkの署名中に使用したファイル名を確認します(Android studio内)。
  3. 署名されたapkをデバイスにインストールします。
  4. 5分間待ちます。
  5. Googleで歌ってみてください。それでも12501が来ている場合は、さらに5分間待ちます。その間、Gradle Syncがヒットしました。
  6. 再試行する。動作するはずです。
0
Mido Reigh

同じ12501 statusエラーに直面していました。これは、リリースAPKとデバッグAPKのSHA-1の不一致が原因です。

  1. 署名済みAPKを作成します。 APKに署名するには、SHA-1の作成に使用したキーストアの既存のパスを選択します。例えば/.Android/debug.keystore
  2. エイリアス名を付けます:androiddebugkey
  3. storepassおよびkeypass:Android。
0

このエラーの奇妙な経験から、このエラーを取り除くために携帯電話を再起動する必要もあると言えます:) 。そのため、最初のサインインでは、Device Policyアプリのインストールが必要でした。後のすべての手順が完了した後、12501エラーがスローされました。同じアプリが他の携帯電話でも正常に機能していました。したがって、再起動のみが役立ちました。しかし、助けた

0
serggl

アプリに自動的に署名する のGoogleの指示に従った後、私もこの問題を抱えていました。この方法を使用してアプリに署名する場合、生成されたキーストアフィンガープリントをAPI資格情報に含める必要があります。

プロジェクトブラウザで、アプリを右クリックし、[モジュール設定を開く]を選択します。

Screenshot of Open Module Settings | app | signing | config

.jksファイルをプロジェクトの/appディレクトリに置くと、混乱が少なくなります。いずれにせよ、この行を実行してください。

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

パスワードの入力を求められます。私のものは同じであるため、それがKey PasswordStore Passwordかどうかはわかりません。 :|

コンソールは、証明書の指紋の束を吐き出します。 SHA1を受け取り、 Google API Developer's Console でAPI資格情報にパンチします。アプリで実際にclient_idを使用していなくても、AndroidクライアントOAuth 2.0 client IDsに入力する必要があります。 Android用の他のAPIを使用している場合は、API keysの下の適切なキー資格情報にも同じSHA1を入れます。

0
Keith

わずか数行のコードでアプリにGoogle SignInオプションを追加するlibを開発しました。お試しください HiGoogle- Google SignIn Made Easy

Androidアプリケーションではなく、server_client_idとしてWebアプリケーションを使用します。 HiGoogleコンストラクターに渡します。

0
Shivam Agrawal