具有自定义 uri 架构的桌面应用程序,根据令牌请求 "Missing scheme"

Desktop application with custom uri schema, "Missing scheme" on token request

我正在 Delphi 中编写桌面应用程序并尝试将其与 Google 日历同步(仅限 windows,win 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# 应用程序向它发送令牌请求并监视请求正文。 唯一明显的区别是 delphi url 自动编码代码(例如 4%2Fhky... 而不是 4/Fhky...)。除此之外,它们看起来完全相同。

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

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

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