Google Contacts API - 无法刷新访问令牌

2024-01-28

我们将 Google Contacts API 与 OAuth2 结合使用:

credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
        .setJsonFactory(new JacksonFactory())
        .setClientSecrets(OAuth2ClientId(), OAuth2ClientSecret())
        .addRefreshListener(new CredentialRefreshListener() {...});

myService = new ContactsService("My-App");
myService.setOAuth2Credentials(credential);

我们经常收到 GData 库无法处理的“401 Unauthorized”响应。 AuthenticationException 抛出 NPE 时WWW-Authenticate标头丢失。

Caused by: java.lang.NullPointerException: No authentication header information
        at com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.util.AuthenticationException.<init>(AuthenticationException.java:67) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:608) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:564) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536) ~[gdata-core-1.0-1.47.1.jar:na]
        at com.google.gdata.client.Service.getFeed(Service.java:1135) ~[gdata-core-1.0-1.47.1.jar:1.47.1]
        at com.google.gdata.client.Service.getFeed(Service.java:1077) ~[gdata-core-1.0-1.47.1.jar:1.47.1]
        at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:676) ~[gdata-core-1.0-1.47.1.jar:1.47.1]
        at com.google.gdata.client.Service.query(Service.java:1237) ~[gdata-core-1.0-1.47.1.jar:1.47.1]
        at com.google.gdata.client.Service.query(Service.java:1178) ~[gdata-core-1.0-1.47.1.jar:1.47.1]

我们设法添加一个包装器来尝试在此 NPE 上刷新令牌。它有帮助,但仍然有很多刷新失败的情况:

credential.refreshToken() == false

当我们跑步时refreshToken()在调试器中我们看到executeRefreshToken()执行时没有异常,但是tokenResponse==null被返回。因此refreshToken()回报false并且没有任何理由传递给听众

try {
    TokenResponse tokenResponse = executeRefreshToken();
    if (tokenResponse != null) {
      setFromTokenResponse(tokenResponse);
      for (CredentialRefreshListener refreshListener : refreshListeners) {
        refreshListener.onTokenResponse(this, tokenResponse);
      }
      return true;
    }
  } catch (TokenResponseException e) {
    boolean statusCode4xx = 400 <= e.getStatusCode() && e.getStatusCode() < 500;
    // check if it is a normal error response
    if (e.getDetails() != null && statusCode4xx) {
      // We were unable to get a new access token (e.g. it may have been revoked), we must now
      // indicate that our current token is invalid.
      setAccessToken(null);
      setExpiresInSeconds(null);
    }
    for (CredentialRefreshListener refreshListener : refreshListeners) {
      refreshListener.onTokenErrorResponse(this, e.getDetails());
    }
    if (statusCode4xx) {
      throw e;
    }
  }
  return false;

我们的代币始终适用于多个范围:https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds https://www.googleapis.com/auth/calendar https://mail.google.com/ https://www.googleapis.com/auth/tasks

Update:我们已成功迁移到 People API,并且我们的 Unified API Contacts API 也使用新的 APIhttps://docs.arinko.io/article/25-contacts-api https://docs.aurinko.io/article/25-contacts-api


目前,Contacts API 中存在一个错误,某些 HTTPUser-Agent字符串,导致 401 响应作为 HTML 页面而不是 XML 响应返回,并且缺少WWW-Authenticate标头表示AuthenticationException类是依托。GContacts-Java是这些特殊用户代理字符串之一。解决方法是在创建客户端后更改客户端的用户代理:

ContactsService service = new ContactsService(applicationName);
service.getRequestFactory().setHeader("User-Agent", applicationName);

这应该消除 NPE,并允许客户端库自动检测过期的令牌并自动刷新它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Contacts API - 无法刷新访问令牌 的相关文章

随机推荐

  • VS 2015 文件保存时 CPU 使用率较高

    使用 Visual Studio 2015 我注意到 如果我使用所有解决方案的通用项目打开多个解决方案 如果我编辑并保存属于通用项目的一个 cs 文件 则所有 Visual Studio 2015 实例将消耗 CPU 10 15秒 请注意
  • (很多)UIWebView 内存泄漏

    我从其他帖子中看到 UIWebView 存在内存泄漏问题 然而 由于我泄漏的对象数量很多 我不得不怀疑我是否做错了什么 Leaks 报告了关于打开 UIWebView 加载页面和关闭 这是 Facebook 登录页面 的大约 60 次泄漏
  • java进程中提交内存和RSS的区别

    我正在运行一个简单的 java 进程 该进程运行 jetty 其顶部显示 2 9g 的 RAM 使用的JDK版本是1 8 0 112 使用本机内存跟踪 jcmd 显示总提交内存仅为 1 5G 内存 正如 jvisualvm 所报告的 直接缓
  • 添加用户输入的数字并在用户输入“end”时中断的循环

    创建一个不需要参数的函数 该函数要求用户输入一系列大于或等于零的数字 一次一个 用户键入 end 表示不再有数字 该函数计算所有输入值的总和 我应该能够仅使用 while 循环和 if 语句来完成此操作 我遇到的主要问题是我不知道如何做到这
  • SQLite 查询根据另一个表的值获取表

    我不确定这里必须有什么标题才能正确反映我的问题 我只能描述我想要的内容 有一个包含字段的表 id name city 还有接下来的几行 1 John London 2 Mary Paris 3 John Paris 4 Samy Londo
  • 无法使用 Laravel Mix 复制文件夹

    我有一个项目使用拉拉维尔 5 4 and Laravel 混合 我有一个图像文件夹 其中一些图像具有相同的名称但类别不同 因此它们包含在不同的目录中 So resources assets images globalimage png ve
  • 由于共享库事件而停止 - Visual Studio Code

    我是 Visual Studio Code 的初学者 我尝试在其上调试我的 C 代码 我这里有一个示例代码 include iostream using namespace std int main cout lt lt hello wor
  • My.Settings 中自定义类的数组列表

    我有一个 Visual Basic Net 2 0 程序 我正在将设置从较旧的设置文件移至 app config 程序设置文件 我正在努力尽可能地做好这件事 所以 我添加了我的设置如图所示 https i stack imgur com e
  • 启动应用程序时使用 pg-promise 验证数据库连接

    我正在构建一个快速应用程序 它使用以下命令连接到 postgres 数据库pg 承诺 https github com vitaly t pg promise module 我想确保启动应用程序服务器时数据库连接成功 换句话说 如果与数据库
  • Android 在通知单击时打开特定选项卡片段

    我有一个使用操作栏选项卡的 Android 应用程序 还有一个通知系统 我想在单击通知时直接打开特定选项卡 如何做到这一点 因为通知挂起意图只能打开活动 而我的主要活动包含 3 个选项卡的 3 个片段 以下是选项卡主要活动的代码 publi
  • Ionic v2 按钮文本大写

    在我的 ionic v2 应用程序中有一个按钮 无论我输入哪个文本 它总是大写 我不想添加 css utilities 因为我混合了小写和大写单词 这是我的代码
  • SQLiteConstraintException 不要进入 catch 内部

    当我运行该代码时 db insert 内部出现异常 08 29 15 40 17 519 E SQLiteDatabase 3599 android database sqlite SQLiteConstraintException col
  • Mono .EXE 程序集集资源管理器图标

    在Linux上使用gmcs编译时 如何设置最终EXE将使用的资源管理器图标 我有一个 ico 文件要附加到输出 exe 答案必须是可自动化构建并在 Linux 上执行 无需 wine 构建机器架构不是 x86 可以使用针对 Windows
  • 将 XML 值反序列化为枚举时处理额外空格

    我一直想知道是否可以做到这一点 当 XML 响应有不正确的值需要映射到枚举时 这将是一个很大的帮助 我具体处理的情况是当期望值有尾随空格而枚举期望它没有尾随空格时 XML
  • Android 编程中 b/w app:theme 和 android:theme 有什么区别

    我看到有人写这个 app theme style xyz 另一方面 有些人写 android theme style xyz 这2个代码有什么区别 app and android实际上是命名空间 你可以用同样的方式来思考它们packages
  • IdHTTP 如何发送原始正文

    我如何使用IdHTTP发送消息为PostMan下面的dos 我的第一次尝试如下 function TIdFoo SendIM const AID AMessage string Boolean const URL https URL com
  • SOM(自组织映射)和 K 均值有什么区别?

    stackoverflow中只有一个与此相关的问题 更多的是关于哪个更好 我只是不太明白其中的区别 我的意思是它们都使用向量 这些向量被随机分配给集群 它们都使用不同集群的质心来确定获胜的输出节点 我的意思是 差异到底在哪里 在 K 均值中
  • 如何正确验证验证码?

    我有使用验证码验证的登录表单 我在 php 文件中编写验证时遇到问题 如果验证码输入不正确 则会出现错误 目前我已经验证 如果没有输入验证码 它会显示错误 但是当我输入一些错误的验证码时 登录将继续并将用户登录到站点 这是我的代码 感谢任何
  • Maven 依赖范围未按预期工作

    Maven 2 2 1 声称支持版本范围 参见例如http www sonatype com books mvnref book reference pom relationships sect project dependency htm
  • Google Contacts API - 无法刷新访问令牌

    我们将 Google Contacts API 与 OAuth2 结合使用 credential new GoogleCredential Builder setTransport new NetHttpTransport setJsonF