当前位置 : 主页 > 手机开发 > android >

在Android上获取OAuth2令牌时UNREGISTERED_ON_API_CONSOLE

来源:互联网 收集:自由互联 发布时间:2021-06-11
我们在 Android(Jellybean和更高版本)下,我们有一个应用程序需要使用OAuth2与Google进行身份验证. 我简化了登录活动,但它看起来像这样: AccountManager mAccountManager;// [...]Account account = new Accou
我们在 Android(Jellybean和更高版本)下,我们有一个应用程序需要使用OAuth2与Google进行身份验证.

我简化了登录活动,但它看起来像这样:

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

网友评论