私たちはAndroid(Jellybean以降)の下にいます。認証のためにGoogleでOAuth2を使用する必要があるアプリがあります。
ログインアクティビティを簡略化しましたが、次のようになります。
_AccountManager mAccountManager;
// [...]
Account account = new Account("[email protected]", "com.google");
// same with professional email managed by Google as [email protected]
// real code recovers accounts with mAccountManager.getAccountsByType("com.google")
mAccountManager = AccountManager.get(getBaseContext());
mAccountManager.getAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", null, MyActivity.this, new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> accountManagerFuture) {
try {
String token = accountManagerFuture.getResult().getString(AccountManager.KEY_AUTHTOKEN);
// exception occurs here
// [...]
} catch (Exception e) {
Log.e("account", "exception occurs", e);
}
}
}, null);
_
accountManagerFuture.getResult()
を呼び出すと、次の例外が発生します。
_Android.accounts.AuthenticatorException: UNREGISTERED_ON_API_CONSOLE
at Android.accounts.AccountManager.convertErrorToException(AccountManager.Java:2024)
at Android.accounts.AccountManager.access$400(AccountManager.Java:144)
at Android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.Java:1867)
at Android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.Java:69)
at Android.os.Binder.execTransact(Binder.Java:446)
_
私はこれに関するドキュメントも同じ例外を持つ他の人々も見つけることができず、混乱しています:_AccountManager.getAuthToken
_への呼び出しは、アカウント(名前とタイプ)、スコープ、コールバックメソッドのみを提供し、 dev APIコンソールでアプリまたはカスタマイズできるものを指定するパラメーター。
私は何かを逃していると確信していますが、何ですか?
さて、私はついにそれを理解しました。ドキュメントを読み間違えたのか、リンクが抜けているのかはわかりませんが、とにかくです。
事実は、APKに署名してからGoogleにOAuth2トークンを要求するとき、開発者コンソールから署名済みアプリを登録する必要があるということです。これは、アプリパッケージ名とsha1フィンガープリントに基づいたセキュリティ対策です。
それを行うには、以下を行う必要があります。
signingReport
タスクを選択します。ルートプロジェクトを実行して実行します-SHA1フィンガープリントがテキスト出力に表示されます。そして出来上がり!
詳細については、2つの最終ステップの理由と方法を説明する唯一の公式ドキュメントは次のとおりです。 https://developers.google.com/drive/Android/auth
まだこれに苦労している人のために、ここに私のために働いたものがあります:
アプリをGoogle Playアプリの署名プログラムに登録すると、KeyStoreは事実上、Playストアに到達した後にアプリケーションに署名するために使用されません。そのため、指紋が一致しません。
Googleは証明書を削除し、APKの署名に使用される新しい署名証明書を作成します。
PlayコンソールでRelease Management-> App signingに移動します
Google Playアプリの署名にオプトインした場合、2つの証明書とすべての指紋が表示されます。キーストアである証明書のアップロードの代わりにアプリ署名証明書フィンガープリントを使用します。
受け入れられた答えについてコメントする評判がありません...
Google Dev Consoleでアプリを登録してもうまくいきませんでした。デバッググラドルビルドを使用していたため、Google開発コンソールのパッケージ名に「.debug」を追加する必要がありました。
Android AccountManagerコードをデバッグすることでこれを見つけました。コードに足を踏み入れたとき、アプリのパッケージ名の変数の末尾に「.debug」があることに気付きました。 Google開発コンソールで実際のパッケージ名「com.package.name」を使用して、「com.package.name.debug」に変更し、UNREGISTERED_ON_API_CONSOLE例外を修正しました。
これは、gradleのデバッグbuildTypeに 'applicationIdSuffix ".debug"'があったためです。
Xavier Porteboisに感謝します。あなたの答えは本当に役に立ちました。さらに2つのステップを実行する必要がありました。
有益な答えをありがとう!
私にとって、上記のソリューションはまったく機能しません。最終的に自分でバグを見つけました。ワークスペースにいくつかのフォルダーがあり、それぞれに独自のManifest.xmlファイルがあります。パッケージ名。この場合、Google APIに登録するとき、ファイルbuild.gradleでパッケージ名を使用する必要があります。プロパティapplicationId。それからここにあります。
私にとって、問題はデバッグアプリの署名証明書フィンガープリント(SHA-1)であり、アプリをアップグレードしてパッケージ名を変更するとリリースアプリが一致しません。パッケージ名を確認するのに何日も費やしましたが、問題はパッケージ名であることがわかりました。
正しいSHA-1キーを取得するには、この S.O投稿 を実行し、このキーを使用してアプリの新しいOAuthクライアントIDを作成します。