79

新しい Google プレイ サービス 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を作成していなかったためです(ドキュメントは冗長か何かだと思いました)

それが言うように、それはこれであり、メソッドrequestIdTokenまたはrequestServerAuthCodeのパラメーターとして使用する必要があるのはこれだけです。

このメソッドで Android OAuth ID を使用することは忘れてください。そうすると、常に醜いステータス コード レスポンス 12501 が返されるためです。

主な問題は、ドキュメントがこれについて少し混乱していることだと思います。または、2 つの OAuth ID を作成する必要があるという事実が少し奇妙だからかもしれません。

要約すると、Android 用と Web アプリケーション用の 2 つの OAuth ID が必要であり、それぞれを正しい場所に設定する必要があります。

于 2015-11-13T09:08:39.583 に答える
20

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

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

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

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

于 2016-06-06T12:49:10.537 に答える
15

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

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

于 2015-11-13T12:06:14.220 に答える
8

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

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

于 2015-11-12T20:49:35.230 に答える
3

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

于 2015-12-04T23:15:07.850 に答える
2
  1. あいまいなグーグルの文書に従ってください。
  2. google-services.json をプロジェクト ディレクトリに配置します。
  3. Gradle をhttps://stackoverflow.com/a/35216421/5886475として設定します

  4. string.xml に server_client_id を設定します。Androidクライアントではなく、 Web クライアント IDです。

于 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 に答える
2

私が抱えていた問題は、間違ったエイリアスで生成した SHA-1 です。エイリアスは 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(); 
于 2016-11-09T22:29:14.583 に答える
1

同じ問題とエラー12501があり、上記のどれもうまくいきませんでした。

私の問題は、私のために生成されたGoogleのデフォルトWeb APIを使用していたことです。独自のWeb APIエラーを作成した後、消えて正常に機能しました!

これらは作業手順です:

  1. まず、SHA1 デバッグ キーを作成し、Firebaseコンソールに追加します。ここから SHA1 を作成します。
  2. ここから 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:私のようなイラン出身の場合は、Google からユーザーを取得できますが、取得できずAuthWithGoogle、結果が返さfailauth.signInWithCredential(credential)、true を返すためにプロキシを使用する必要がありました。

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

ここに画像の説明を入力

ヘルプがいっぱいになることを願っています

于 2017-01-01T06:13:36.893 に答える
1

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

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

リリースに設定された署名構成

于 2016-11-15T16:46:51.110 に答える
0

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

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

モジュール設定を開くのスクリーンショット |  アプリ |  署名 |  構成

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

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

パスワードの入力を求められます。Key PasswordかどうかはわかりませんStore Password。私のものは同じだからです。:|

コンソールは、一連の証明書のフィンガープリントを吐き出します。SHA1 を取得し、Google API デベロッパー コンソールで API 資格情報に入力します。OAuth 2.0 client IDsアプリで client_id を実際に使用しない場合でも、Android クライアント用に入力する必要があります。Android 用の他の API を使用している場合は、同じ SHA1 を適切なキー資格情報にも入れAPI keysます。

于 2016-03-12T05:29:18.463 に答える
0

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

  1. Google API 資格情報に移動

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

    2

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

  3. [OK] をクリックします。

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

    それはうまくいくはずです。

于 2017-04-23T00:11:29.267 に答える
0

この質問にはすでに多くの支持された回答が存在しますが、私はその論理を理解するのに苦労しました。だから、私は自分の研究を思いつきます。

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、プロジェクトにファイルを追加する必要はありません (ファイルを生成すると、必要な構成手順が実行されます)。

于 2016-12-28T10:17:57.337 に答える