web-dev-qa-db-ja.com

AndroidでOAuth2トークンを取得中のUNREGISTERED_ON_API_CONSOLE

私たちは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コンソールでアプリまたはカスタマイズできるものを指定するパラメーター。

私は何かを逃していると確信していますが、何ですか?

13

さて、私はついにそれを理解しました。ドキュメントを読み間違えたのか、リンクが抜けているのかはわかりませんが、とにかくです。

事実は、APKに署名してからGoogleにOAuth2トークンを要求するとき、開発者コンソールから署名済みアプリを登録する必要があるということです。これは、アプリパッケージ名とsha1フィンガープリントに基づいたセキュリティ対策です。

それを行うには、以下を行う必要があります。

  1. 手動で、またはGradleなどを介してAPKに署名します: Android documentation はこのステップではかなり明確です。
  2. sha1フィンガープリントを取得します。 this SO answer で言及されているように、Android St​​udioの場合は簡単です。Gradleパネルで、signingReportタスクを選択します。ルートプロジェクトを実行して実行します-SHA1フィンガープリントがテキスト出力に表示されます。
  3. Google開発コンソール を使用してAPKを登録します。新しい資格情報を作成します/ OAuthクライアントID/Android、取得したSHA1フィンガープリントとAPKパッケージ名によって定義されます。

そして出来上がり!

詳細については、2つの最終ステップの理由と方法を説明する唯一の公式ドキュメントは次のとおりです。 https://developers.google.com/drive/Android/auth

32

まだこれに苦労している人のために、ここに私のために働いたものがあります:

アプリをGoogle Playアプリの署名プログラムに登録すると、KeyStoreは事実上、Playストアに到達した後にアプリケーションに署名するために使用されません。そのため、指紋が一致しません。

Googleは証明書を削除し、APKの署名に使用される新しい署名証明書を作成します。

PlayコンソールでRelease Management-> App signingに移動します

Google Playアプリの署名にオプトインした場合、2つの証明書とすべての指紋が表示されます。キーストアである証明書のアップロードの代わりにアプリ署名証明書フィンガープリントを使用します。

13
Itai Hanski

受け入れられた答えについてコメントする評判がありません...

Google Dev Consoleでアプリを登録してもうまくいきませんでした。デバッググラドルビルドを使用していたため、Google開発コンソールのパッケージ名に「.debug」を追加する必要がありました。

Android AccountManagerコードをデバッグすることでこれを見つけました。コードに足を踏み入れたとき、アプリのパッケージ名の変数の末尾に「.debug」があることに気付きました。 Google開発コンソールで実際のパッケージ名「com.package.name」を使用して、「com.package.name.debug」に変更し、UNREGISTERED_ON_API_CONSOLE例外を修正しました。

これは、gradleのデバッグbuildTypeに 'applicationIdSuffix ".debug"'があったためです。

8
Jeff Angelini

Xavier Porteboisに感謝します。あなたの答えは本当に役に立ちました。さらに2つのステップを実行する必要がありました。

  • 同じGoogle開発コンソールで、使用しているサービス(私の場合はCalendar API)のAPIを必ず有効にしてください。
  • Google Playアプリの署名を使用している場合、debug SHA Fingerprint from Android Studio。代わりに、アプリ公開コンソールに移動します- >リリース管理->アプリ署名アプリ署名証明書のSHA-1フィンガープリントを使用 このスクリーンショットの2行目

有益な答えをありがとう!

1
Emilie

私にとって、上記のソリューションはまったく機能しません。最終的に自分でバグを見つけました。ワークスペースにいくつかのフォルダーがあり、それぞれに独自のManifest.xmlファイルがあります。パッケージ名。この場合、Google APIに登録するとき、ファイルbuild.gradleでパッケージ名を使用する必要があります。プロパティapplicationId。それからここにあります。

0
Weiheng Lian

私にとって、問題はデバッグアプリの署名証明書フィンガープリント(SHA-1)であり、アプリをアップグレードしてパッケージ名を変更するとリリースアプリが一致しません。パッケージ名を確認するのに何日も費やしましたが、問題はパッケージ名であることがわかりました。

正しいSHA-1キーを取得するには、この S.O投稿 を実行し、このキーを使用してアプリの新しいOAuthクライアントIDを作成します。

0
nhoxbypass