我们在 Android(Jellybean和更高版本)下,我们有一个应用程序需要使用OAuth2与Google进行身份验证. 我简化了登录活动,但它看起来像这样: AccountManager mAccountManager;// [...]Account account = new Accou
我简化了登录活动,但它看起来像这样:
AccountManager mAccountManager; // [...] Account account = new Account("myEmail@gmail.com", "com.google"); // same with professional email managed by Google as myEmail@myDomain.com // 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指纹的安全措施.
要做到这一点,你必须:
>手动或通过Gradle或其他任何方式签署您的APK:Android documentation在此步骤中非常清楚;
>得到你的sha1指纹;正如在this SO answer中所提到的,它在Android Studio上很容易:在Gradle面板中,选择根项目下的signingReport任务并运行它 – SHA1指纹将显示在文本输出中;
>通过Google dev console注册您的APK:创建一个新的凭据/ OAuth客户端ID / Android,由您获得的SHA1指纹和您的APK包名称定义.
瞧!
有关信息,我发现的唯一官方文档解释了最后两个步骤的原因和方法:
https://developers.google.com/drive/android/auth