来自服务器的 OAuth2“无效授予”响应

2024-04-11

我要求我的客户使用他创建了 google api 项目的授权 gmail 帐户访问此 URL。

https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=http://www.XXXXXXXX.com/oauth2callback&client_id=XXXXXX.apps.googleusercontent.com&state=profile&approval_prompt=force

然后让他给我提供重定向URL中的code参数

http://www.XXXXXXXX.com/oauth2callback?code=4/jUxc2MdX0xmF-b4_I6v2SLMQMuxO.cvQLVEpcJMUXOl05ti8ZT3ZvsT9ddwI

然后我自己发布此表格并包含以下信息。

<form action="https://accounts.google.com/o/oauth2/token" method="post" >

<input type="hidden" name="grant_type" value="authorization_code" >
<input type="text" name="code" value="**is the one i recieved from previous step**">
<input type="hidden" name="client_id" value="XXXXXXX.apps.googleusercontent.com" >
<input type="hidden" name="client_secret" value="XXXXXXXXXXXX" >
<input type="hidden" name="redirect_uri" value="http://www.XXXXXX.com/oauth2callback" >
<input type="submit" value="Submit">

</form>

然后我收到以下错误

{
    "error" : "invalid_grant"
}

当我自己生成代码 url 参数并执行下一步时。我成功收到以下回复

{
  "access_token" : "XXXXXXStBkRnGyZ2mUYOLgls7QVBxOg82XhBCFo8UIT5gM",
  "token_type" : "Bearer",
  "expires_in" : 3600,
  "refresh_token" : "XXXXXX3SEBX7F2cfrHcqJEa3KoAHYeXES6nmho"
}

但是,如果客户端生成 url 参数“代码”,那么我会看到无效的授予错误。

我的客户在英国,我在另一个国家。任何人都可以确认这是否是错误,因为客户端在另一个国家/地区生成代码参数,而我在另一个国家/地区使用该代码?

提前致谢。


我对 invalid_grant 错误感到恼火,而不是相同的代码有时让我获得正确的访问令牌这一事实。

谢赫的回答引导我走向正确的方向。

首先,我们尝试从以下位置获取访问代码:

https://accounts.google.com/o/oauth2/auth https://accounts.google.com/o/oauth2/auth

用户被定向到“允许权限”屏幕,然后我们的应用程序接收访问代码。

使用该访问代码,我们尝试从以下位置获取访问令牌:

https://accounts.google.com/o/oauth2/token https://accounts.google.com/o/oauth2/token

第一次尝试时,它会返回带有 grant_type=authorization_code 的 access_token,但是一旦向我们提供了 access_token,它就不再期望再次接收 grant_type=authorization,而是喜欢接收 grant_type=refresh_token

对于android开发者来说,代码如下:

String accessToken = null, refreshToken = null;
HttpPost httppost = new HttpPost(https://accounts.google.com/o/oauth2/token);
HttpParams myParams = new BasicHttpParams();
httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(4);
nameValuePairs.add(new BasicNameValuePair("client_id", BLOGGER_CLIENT_ID));
SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE);
String bloggerAccessToken = prefs.getString(PREFERENCES_KEY_BLOGGER_ACCESS_TOKEN, null);

if(bloggerAccessToken != null && bloggerAccessToken.length() > 0){
    nameValuePairs.add(new BasicNameValuePair("refresh_token",  prefs.getString(PREFERENCES_KEY_BLOGGER_REFRESH_TOKEN, null)));
    nameValuePairs.add(new BasicNameValuePair("grant_type",    "refresh_token"));
} else{
    nameValuePairs.add(new BasicNameValuePair("code",  prefs.getString(PREFERENCES_KEY_BLOGGER_ACCESS_CODE, null)));
    nameValuePairs.add(new BasicNameValuePair("grant_type",    "authorization_code"));
    nameValuePairs.add(new BasicNameValuePair("redirect_uri",  "http://localhost"));
}

httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpClient httpClient = new DefaultHttpClient(myParams);
response = httpClient.execute(httppost);

String returnedJsonStr = EntityUtils.toString(response.getEntity());
JSONObject jsonObject = new JSONObject(returnedJsonStr);
accessToken = jsonObject.getString("access_token");
if(jsonObject.has("refresh_token"))
    refreshToken = jsonObject.getString("refresh_token");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自服务器的 OAuth2“无效授予”响应 的相关文章

随机推荐

  • 自定义字体和 XML 布局 (Android)

    我正在尝试在 Android 中使用 XML 文件定义 GUI 布局 据我所知 没有办法指定您的小部件应该在 XML 文件中使用自定义字体 例如您放置在 asset font 中的字体 并且您只能使用系统安装的字体 我知道 在 Java 代
  • ggplot2 中的并排水平图例

    我想让我的 ggplot 图例并排出现在图下方 变量名称位于符号上方 就像它们在this https kohske wordpress com 2010 12 25 various position adjustments of legen
  • Html 锚文本格式

    这可能是一个基本问题 但我使用的是 HTML 锚点 锚点的文本作为多行段落 我有 br 锚文本部分中当前无法识别的标签 所有文本在输出中都在一行中 锚标签代码如下 li a href title View all Printed Docum
  • 为什么 arr 和 &arr 相同?

    我已经编程c c 很多年了 但是今天的偶然发现让我有些好奇 为什么下面的代码中两个输出产生相同的结果 arr当然是地址arr 0 即指向arr 0 我本来期望 arr是该指针的地址 但它具有相同的值arr int arr 3 cout lt
  • 如何使用 Visual Studio 命令行 + SCons 构建 Windows XP 应用程序?

    使用 Visual Studio 2015 IDE 构建 Windows XP 应用程序一点也不难 您只需要使用正确的平台工具集 v120 xp 或 v140 xp 并确保在目标计算机上安装正确的可再发行 Visual Studio 运行时
  • 绘制可调整大小(不相交)的多边形

    我到处寻找但找不到答案 我 需要通过鼠标交互绘制可调整大小的多边形 但我 不希望出现不规则 重叠或相交的多边形 结尾 这是绘制可调整大小的多边形的简单示例http www wolfpil de polygon html http www w
  • Pom.xml项目构建错误

    我已经在 Eclipse 中导入了 Maven 项目 但在 pom xml 中出现以下错误 项目构建错误 dependencyManagement dependency dependency systemPath 为 jdk tools j
  • 如何在uWSGI中配置允许的GET参数字符数?

    我正在使用 nginx uWSGI 运行 Django 刚刚从本地开发转移到临时服务器后 我发现我们发出的特定 GET 请求有一个很长的查询字符串 尝试调试 似乎 uWSGI 不接受这个基于长度的查询字符串 我可以传递短字符串并且它可以工作
  • 为什么 $1 在 hashref 赋值中指向与多个正则表达式匹配的相同值?

    对于没有故事的问题 请跳到行后 我正在把一串由一些字母和数字组成的字符串 这两种情况都可能出现 分成散列引用中的两个字段 仅当该字段存在时它们才应该出现 该字符串可能如下所示 D d 例如ZR17 R15 19 22 我不想简单地将其放入这
  • Oracle - 特定用户的审计跟踪

    正如主题所述 我正在寻找一种方法来跟踪特定用户的活动 可能有也可能没有 SYSDBA 或 SYSOPER 权限 例如 人力资源部 我想知道他的登录详细信息是什么 他更改了哪些对象 它们的原始值是什么 执行的 SQL 语句 执行了哪些过程 函
  • 升级 Zend Framework - 步骤和指南

    我维护的网站目前使用的是 Zend Framework 1 8 0 该版本已经有 2 年多的历史了 我想升级到 1 11 11 但在寻找如何顺利完成此操作的基本指南方面遇到了一些困难 就像用最新文件覆盖library Zend文件夹一样简单
  • 如何在 C++ 中将调色板生成器和调色板使用过滤器与 FFmpeg 一起使用?

    我想在 QT 项目中创建一个动画 gif 当我直接将 QImage 缩放到 AV PIX FMT RGB8 时 输出看起来很糟糕 带有闪烁的伪影 而当我缩放到 AV PIX FMT YUV420P 之间时 输出会抖动 这看起来并没有好多少
  • 即使在同一类型上,是否应该使用 new 位置来调用析构函数

    include
  • 对于大量插入,多久调用一次 DataContext.SubmitChanges() ?

    多少InsertOnSubmit我应该在打电话之前打电话吗SubmitChanges 我正在添加来自 Web 服务的数据 该服务一次可以返回数万条记录 Web 服务周围的包装类公开记录IEnumberable集合来隐藏复杂的分块机制 是否有
  • Playframework:如何在不同项目之间共享模型?

    我想与其他一些项目共享我的模型 他们使用相同的模型 但不使用相同的字段映射和约束 我想知道是否有办法从模型中提取注释并使用 xml 配置代替 或者其他方式来实现这一目标 注意 我正在使用play 1 3 上周我正在分析类似的事情 存档的一种
  • 如何使用 PowerShell 读取 MSBuild PropertyGroup 的值?

    我有以下 MSBuild TestBuild xml file
  • 测试矩阵的每个元素的条件

    我想测试数据帧的每个元素是否都大于 0 如果它大于零 我们将 买入 否则 卖出 我用的是sapply 它分配了每个值 卖出 我使用了以下代码 还推荐 for 循环解决方案 df1 lt sapply df function x ifelse
  • 如何从 [Code] 部分中止 /VERYSILENT 模式下的 Inno Setup 安装?

    我正在尝试从以下位置启动某个 Windows 服务 Code 部分 在AfterInstall处理程序 当它无法启动时 我想回滚安装 通常 当从 UI 运行安装程序时 WizardForm Close 做对了工作 但是当安装程序执行时 ve
  • 在 AWS 资源的往返工程中使用 CloudFormer

    我想以自动方式使用 CloudFormer 来生成 VPC 中现有资源的模板 我可以使用 Ruby SDK CloudFormation Client create stack 创建 cloudformer 实例 并使用 CloudForm
  • 来自服务器的 OAuth2“无效授予”响应

    我要求我的客户使用他创建了 google api 项目的授权 gmail 帐户访问此 URL https accounts google com o oauth2 auth scope https www googleapis com au