具有自定义uri架构的桌面应用程序,"缺少方案"在令牌请求上

时间:2016-10-21 08:11:17

标签: delphi google-api google-calendar-api google-oauth2

我正在Delphi中编写桌面应用程序并尝试将其与Google日历同步(仅限Windows,赢得7及更新)。我在系统注册表中注册了自定义uri架构,因此eu.myapp:test将运行我的程序或将消息传递给已经运行的程序实例。

我设法完成了身份验证的第一步 - 我打开默认浏览器,要求用户修改其日历的权限,我将验证码重新发送到我的软件中。 oauth客户端已注册为iOS应用程序,

但是,当我尝试请求实际令牌时,请求被拒绝(400 - 错误请求),并带有以下响应正文:

{
    "error": "invalid_request",
    "error_description": "Invalid parameter value for redirect_uri: Missing scheme: eu.myapp",
    "error_uri": ""
}

我的请求正文如下:

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=XXX&
client_id=YYY&
redirect_uri=eu.myapp&
grant_type=authorization_code

根据documentation,我应该包含从API控制台获得的重定向URI,但我发现那里没有这样的URI。找到了一些较旧的答案,但开发人员控制台显然已被更改,因为它们已经不再相关。我错过了什么?

修改:添加了更多信息 我构建了一个简单的nodejs服务器并使用SSL证书和nginx,因此我可以看到实际发送的内容。然后我使用我的应用程序和示例C#app向它发送令牌请求并监视请求正文。 唯一明显的区别是delphi url自动编码代码(4%2Fhky ......而不是4 / Fhky ......)。除此之外他们似乎完全相同。

我还尝试重写应用程序以侦听本地端口,但结果却相同。有一个delphi演示,他们通过使用嵌入式浏览器向用户登录(并且它有效)来演示使用google api,但是根据api文档,它已被弃用并且很快就会消失。此外,似乎我可以很好地管理第一个重定向,但获得实际的令牌失败。

1 个答案:

答案 0 :(得分:0)

发现我的错误。我注意到参数是由负责发出请求的delphi组件自动编码的。我在将其设置为令牌请求的参数之前手动编码了重定向uri。然后组件再次对其进行编码,这导致它与代码请求上给出的url不同,这导致了uri_mismatch错误。

uris在两个请求中也需要相同,因为即使第二个请求没有重定向,它仍然使用redirect_uri作为验证参数。