在 Android 上获取 OAuth2 令牌时 UNREGISTERED_ON_API_CONSOLE

2024-01-10

我们使用 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 指纹的安全措施。

为此,您必须:

  1. 手动或通过 Gradle 或其他方式签署您的 APK:安卓文档 https://developer.android.com/studio/publish/app-signing.html这一步很清楚;
  2. 获取您的 sha1 指纹;如中提到的这个答案 https://stackoverflow.com/a/34223470/923712,这在 Android Studio 上很简单:在 Gradle 面板中,选择signingReport根项目下的任务并运行它 - SHA1 指纹将显示在文本输出中;
  3. 通过以下方式注册您的 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(使用前将#替换为@)

在 Android 上获取 OAuth2 令牌时 UNREGISTERED_ON_API_CONSOLE 的相关文章

随机推荐

  • 在 ubuntu 上安装 sbt [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经在 Ubuntu 上安装了 sbt bin sbt bin ls classes sbt sbt launch jar target
  • 'pow' 未在此范围内声明

    include
  • C# 添加或读取 C# exe 文件

    是否可以从另一个 C 项目 Windows 窗体 打开 C exe 文件 控制台应用程序 并从 exe 文件写入或读取不同的文本值 我正在使用 user32dll 来处理 exe 文件 谢谢 我确实使用此方法在 exe 文件中添加文本 Cl
  • 当 x 轴值为日期时,注释绘图很困难

    这是我的数据框 gt s Date Average Treatment SE 1 2014 10 15 4 875 1 1 6304852 2 2014 11 12 6 250 1 0 9955257 3 2014 12 11 0 250
  • 如何在 Bootstrap 3 Carousel 中输出当前幻灯片编号?

    我希望使用 Bootstrap 3 的 Carousel 插件输出当前幻灯片编号 理想情况下 我希望将其作为轮播 div 下方的文本 例如 此处轮播 3 of 9 我可以使用 CMS 中的函数输出图像总数 例如上例中的 9 个 但我不知道如
  • C# 获取句柄列表,AcessViolationException

    Info Net 4 5 测试于 Win7 64位 Win10 64位 虚拟盒 我正在尝试获取外部进程的句柄列表并将它们的名称作为字符串返回 以便我可以在之后关闭特定的进程 因此我使用 Win32API 编写了这个函数 它将检查句柄是否是我
  • AM_LDFLAGS 和 LDFLAGS 有什么区别

    我想知道 AM LDFLAGS 和 LDFLAGS 之间有什么区别 因为我遇到了错误 error AM LDFLAGS must be set with before using 当我在 foreach 循环中使用 AM LDFLAGS 时
  • 接口与抽象类(一般面向对象)

    我最近接受了两次电话采访 被问到接口和抽象类之间的区别 我已经把我能想到的各个方面都解释了 但他们似乎在等我说一些具体的东西 而我也不知道那是什么 根据我的经验 我认为以下内容是正确的 如果我遗漏了一个要点 请告诉我 界面 接口中声明的每个
  • 如何从文档中排除某些字段

    我有以下简单的示意图 var userSchema new Schema name String age Number creator Schema ObjectId var User mongoose model User userSch
  • Python,二维列表和坐标

    我有一个二维列表 def list list1 1 2 3 4 5 list2 0 0 0 0 0 list3 6 7 8 9 10 list list1 list2 list3 for i in list print i list 6 的
  • 如何从 Maven Java 项目加载外部属性文件

    我有一个 Maven Java 项目 其属性文件位于 src main resources 目录中 我打包了jar 但jar中没有属性文件 因此可以将其部署到具有不同设置的不同环境中 但单元测试失败 项目结构是 Properties App
  • asp.net core 1.0 web api使用camelcase

    On RC2相同的代码返回带有驼峰大小写的 json 格式 在 netcore 1 0 发布后 我开始了新项目 相同的代码以小写形式返回 json 尝试了多种解决方案 但没有一个有效web api serialize properties
  • 如何在 PHP 中反转多维数组

    反转多维数组的最简单方法是什么 我所说的反转是指与 array flip 类似 e g 0 5 var name data 0 3 var name2 data2 1 var name3 data3 0 1 4 var name4 data
  • 使用 webdriverjs 等待页面完全加载

    使用 JavaScript 的 selenium webdriver 等待页面完全加载的最佳方法是什么 我注意到这个问题 https stackoverflow com questions 5868439 wait for page loa
  • Java ExecutorService:我应该在使用execute之前加锁吗?

    我的班级组织如下 public class MyClass ExecutorService pool public MyClass pool inited by a class that implements ExecutorService
  • UIButton 过度敏感

    我在 tableviewCellWithReuseIdentifier 中定义了一个 UIButton 该按钮可以使用 但非常敏感 如果我只需点击按钮 它就会起作用 长时间按下它不会触发该操作 即使它确实闪烁表明它知道它被按下了 为什么会发
  • 移除观察员是强制性的(必要的)吗?

    有一个观察者 我在整个应用程序生命周期中都需要它 我应该删除它吗 我认为GC应用程序关闭后将删除它 对吗 如果是的话 我什么时候删除它 在deinit 如果您为 iOS 8 及之前版本提供支持 你必须移除里面的观察者dealloc or v
  • Google 地图实用程序 IOS Pod 错误

    我在使用 pod 将 Google Maps IOS 实用程序 用于标记聚类 添加到我的 swift xcode 项目中时遇到问题 当我跑步时pod install它失败并出现以下错误 Pods App 目标具有传递依赖关系 其中包括静态
  • 我的 IP 在 PHP 主服务器中显示错误

    好吧 足够简单 好吧 也许不是 我的 IP 目前是72 184 212 85然而 上面我在脚本的 IP 阻止系统上使用的代码将我的 IP 显示为我的家庭服务器 IP127 0 0 1 因此 当我转到脚本时 我的 IP 显示为127 0 0
  • 在 Android 上获取 OAuth2 令牌时 UNREGISTERED_ON_API_CONSOLE

    我们使用 Android Jellybean 及更高版本 并且我们有一个应用程序需要使用 OAuth2 与 Google 进行身份验证 我简化了登录活动 但它看起来像这样 AccountManager mAccountManager Acc