我们使用 Android(Jellybean 及更高版本),并且我们有一个应用程序需要使用 OAuth2 与 Google 进行身份验证。
我简化了登录活动,但它看起来像这样:
AccountManager mAccountManager;
// [...]
Account account = new Account("[email protected] /cdn-cgi/l/email-protection", "com.google");
// same with professional email managed by Google as [email protected] /cdn-cgi/l/email-protection
// 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
仅提供帐户(名称和类型)、范围和回调方法,没有参数来指定应用程序或我可以在开发 API 控制台中自定义的内容。
我确信我错过了一些东西,但是什么呢?
好吧,我终于想通了。不确定我是否误读了文档或者是否缺少链接,但无论如何。
事实上,当您签署 APK,然后向 Google 请求 OAuth2 令牌时,您必须通过开发控制台注册您的签名应用程序。这是一种基于应用程序包名称和 sha1 指纹的安全措施。
为此,您必须:
- 手动或通过 Gradle 或其他方式签署您的 APK:安卓文档 https://developer.android.com/studio/publish/app-signing.html这一步很清楚;
- 获取您的 sha1 指纹;如中提到的这个答案 https://stackoverflow.com/a/34223470/923712,这在 Android Studio 上很简单:在 Gradle 面板中,选择
signingReport
根项目下的任务并运行它 - SHA1 指纹将显示在文本输出中;
- 通过以下方式注册您的 APK谷歌开发控制台 https://console.developers.google.com/apis/credentials:创建一个新的 Credentials / OAuth client id / Android,由您获得的 SHA1 指纹和您的 APK 包名称定义。
瞧!
有关信息,我找到的唯一解释最后两个步骤的原因和方式的官方文档在这里:https://developers.google.com/drive/android/auth https://developers.google.com/drive/android/auth
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)