第二次尝试刷新令牌时如何修复“格式错误的身份验证代码”?

2024-06-21

我正在开发一个带有 Angular 和 Cordova 插件的 Android 应用程序,我想将其与 Google 身份验证集成。 我已经安装了cordova-插件-googleplus https://github.com/EddyVerbruggen/cordova-plugin-googleplus我已成功集成到该应用程序中。 当用户登录时,我会收到响应,我可以在其中获取 accessToken、配置文件用户信息和刷新令牌。

现在我想实现一个功能来刷新令牌,而不会每小时用新的提示屏幕打扰用户。

我已成功更新 accessToken,但仅在第一次有效

我用过这两种方式:

  1. 发送带有以下数据的curl请求
curl -X POST \
  'https://oauth2.googleapis.com/token?code=XXXXXXXXXXXXXXXX&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded'
  1. 使用 Google API Client Library for Java 在服务器端实现它,主要遵循以下这些code https://googleapis.dev/java/google-api-client/latest/com/google/api/client/googleapis/auth/oauth2/GoogleAuthorizationCodeTokenRequest.html

重点是,当用户第一次登录(使用 cordova-plugin-googleplus)时,我收到一个具有这种格式的刷新令牌

4/rgFU-hxw9QSbfdj3ppQ4sqDjK2Dr3m_YU_UMCqcveUgjIa3voawbN9TD6SVLShedTPveQeZWDdR-Sf1nFrss1hc

如果一段时间后我尝试以上述任何一种方式刷新令牌,我会收到带有新 accessToken 和新刷新令牌的成功响应。新的刷新令牌具有其他格式

1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J

在第二次尝试更新令牌时,我将令牌替换为第一个请求中返回的令牌

curl -X POST \
  'https://oauth2.googleapis.com/token?code=1/FTSUyYTgU2AG8K-ZsgjVi6pExdmpZejXfoYIchp9KuhtdknEMd6uYCfqMOoX2f85J&client_id=XXXXXXXXXXXXXXXX.apps.googleusercontent.com&client_secret=YYYYYYYYYYYY&grant_type=authorization_code' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: application/x-www-form-urlencoded'

但这一次,两种方式(Curl 和 Java)我都遇到了相同的错误。

{
  "error" : "invalid_grant",
  "error_description" : "Malformed auth code."
}

我读过这个thread https://stackoverflow.com/a/19041051/12155976将 clientId 指定为电子邮件是一个问题,但我还没有发现如何解决它,因为第一次登录是使用客户端 ID“XXXXXXX.apps.googleusercontent.com”完成的,并且如果我设置了来自 google 的电子邮件它说是“未知 Oauth 客户端”的帐户

我希望任何人都可以帮助我,因为我被困了好几天


就我而言,这是非常愚蠢的:google api 更改了请求之间的身份验证代码编码。

步骤 1 - 在第一次请求获取令牌期间,谷歌返回的结果非常正常,而不是编码字符串作为代码。

步骤 2 - 在第二个和第 N 个获取令牌的请求期间(如果它们没有被撤销),Google 将返回 url 编码的身份验证代码。就我而言,致命的变化是“/”->“%2F”。

解决方案: 在将授权代码交换为访问令牌之前,始终对授权代码进行 URL 解码!

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

第二次尝试刷新令牌时如何修复“格式错误的身份验证代码”? 的相关文章

随机推荐

  • 从 AJP 连接器请求中检索 Shibboleth 属性

    当我在 Apache 上运行 Shibboleth 身份验证时遇到了一个奇怪的问题 当 Tomcat7 在后端运行时 Apache 通过 mod proxy ajp 发送所有内容 Shibboleth 的参数也是如此 In the 文档 h
  • 在 Unity3D 中使用 GraphicsMagick

    我正在寻找在 Unity3D 中使用 System Drawing 的替代方案 因为显然 Unity 不支持它 我想简单地在纹理上画一些线 但我想要诸如线宽和边缘圆角之类的选项 这些选项相当复杂 GraphicsMagick 看起来很完美
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 在 OSX 上检测 Objective C 或 C++ 中的文件夹访问(如 fs_usage 命令)

    我正在 OSX 上开发实时病毒扫描程序 OSX 的命令行命令fs usage可以通过以下方式确定文件夹访问权限 并且只能以 root 用户身份运行 fs usage w f pathname grep Users Documents Use
  • 我可以将 CUDA 与非 NVIDIA GPU 一起使用吗? [复制]

    这个问题在这里已经有答案了 我正在寻找一种在没有 NVIDIA GPU 的系统上运行 CUDA 程序的方法 我尝试安装 MCUDA 和 gpuOcelot 但安装似乎遇到一些问题 我已经浏览了中给出的答案如何使用软件实现在没有 GPU 的情
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 使用 Tomcat 和 gradle 进行休眠

    免责声明 我是 Java 新手 我正在尝试使用 Tomcat 和 Gradle 设置 Hibernate 构建运行正确 但看起来像persistence xml文件未被读取 我的项目结构如下 build gradle src main ja
  • 在 Mercurial (Hg) 中,列出自修订版 4822 以来我修改的所有文件的好方法是什么?

    在将一两个功能推送到所有生产服务器之前 我可能会进行两周的开发工作 并且由于这是一个 Ruby on Rails 项目 因此可以修改许多文件 那么使用 Mercurial 作为源代码控制 有没有一个好方法来列出我在当前版本和修订版 4822
  • 警告:在 Visual Studio 2015 中创建跨平台 Xamarin 空白应用程序(Xamarin.Form 便携式)

    每当我尝试创建上述类型的新项目时 我都会收到以下 4 个警告 预更新 Nuget 1 Warning IDE0006 Error encountered while loading the project Some project feat
  • SSRS - 组表达总数总计

    我的小组总数是一个减去最后一个的表达式 Hours1 从一开始的价值 Hours1 团体的价值 EquipmentName1 数据集 dataset1 我需要一个总计 即每件装备的组表达总计 我无法使用相同的公式从数据集 dataset1
  • 安装solr并索引mysql

    任何人都可以帮助我安装 solr 并将其配置到 mysql 表 我已经尝试了几乎所有教程 我尝试了 Jetty 也尝试了 tomcat 仍然收到诸如数据处理程序未定义或找不到 solr 之类的错误 已经一周了 我我一整天都在努力 为了让 s
  • GWT EditTextCell:如何增加EditTextCell中可编辑文本框的宽度?

    我在我的项目中使用GWT2 3 当用户单击 editableTextCell 时 我想增加 editableTextBox 的宽度 问题是我的列宽是 200 Px 当用户单击 editableTextCell 时 EditableTextC
  • 是否有在生产中运行的 Agda 代码示例? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从 Firebase 实时数据库 + 存储加载图像

    我正在使用 Firebase 文档 react redux firebase 中的 create react app 创建类似汽车图片库的东西 图像信息存储在 Firebase 实时数据库中 但实际图像文件存储在 Firebase 存储中
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 无法卷曲 git 标签

    我想通过命令行卷曲 git 标签 curl O http someurl 但是当我尝试解压文件时它被破坏了 有谁知道问题是什么 You can curl来自 GitHub 等 git 存储库托管服务的 git 标签 因为它有专用压缩包服务
  • 如何顺序访问字典?

    我想以元素存储在字典中的方式访问字典 有人可以帮我做这件事吗 提前致谢 字典将其值存储在由键或更精确地由键的哈希值索引的结构中 这就是他们速度很快的原因 他们不需要搜索值 他们只需获取键的值并直接查找值 在大多数情况下 只有在发生冲突的键哈
  • 第二次尝试刷新令牌时如何修复“格式错误的身份验证代码”?

    我正在开发一个带有 Angular 和 Cordova 插件的 Android 应用程序 我想将其与 Google 身份验证集成 我已经安装了cordova 插件 googleplus https github com EddyVerbru