Delphi 具有自定义uri架构的桌面应用程序;“失踪计划”;基于令牌请求

Delphi 具有自定义uri架构的桌面应用程序;“失踪计划”;基于令牌请求,delphi,google-api,google-calendar-api,google-oauth,Delphi,Google Api,Google Calendar Api,Google Oauth,我正在用Delphi编写一个桌面应用程序,并尝试将其与Google日历(仅限windows,win 7及更新版本)同步。我已在系统注册表中注册了自定义uri架构,因此eu.myapp:test将运行我的程序或将消息传递给已运行的程序实例 我成功地完成了身份验证的第一步——我打开默认浏览器,请求用户允许修改他们的日历,我顺利地将身份验证代码返回到我的软件中。oauth客户端已注册为iOS应用程序 但是,当我尝试请求实际令牌时,请求被拒绝(400-错误请求),响应主体如下: { "error

我正在用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
根据,我应该包括从API控制台获得的重定向URI,但是我在那里没有找到这样的URI。找到了一些较旧的答案,但开发人员控制台显然在给出这些答案后已被更改,因此它们不再相关。我错过了什么

编辑:添加了一些详细信息 我构建了一个简单的nodejs服务器,并将其与SSL证书和nginx放在一起,这样我就可以看到实际发送的内容。然后,我使用我的应用程序和示例C#应用程序向它发送令牌请求,并监视请求主体。 唯一明显的区别是DelphiURL自动编码代码(例如,4%2Fhky…而不是4/Fhky)。除此之外,他们看起来一模一样


我还尝试重写应用程序以侦听本地主机端口,但最终得到了相同的结果。有一个delphi演示,他们通过使用嵌入式浏览器让用户登录来演示GoogleAPI的使用(它可以正常工作),但是根据api文档,它已经过时了,很快就会消失。此外,我似乎可以很好地管理第一个重定向,但获取实际令牌失败。

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


两个请求上的uri也必须相同,因为即使第二个请求没有重定向,它仍然使用重定向uri作为验证参数。

如果是桌面应用程序,您可能应该只使用本机凭据或其他凭据。不是iOS。然后您可以只发送urn:ietf:wg:oauth:2.0:oob作为重定向URI。它基本上只是指localhost。这是谷歌推荐的桌面应用程序方法-环回ip或自定义URI模式,实际上它说,在桌面上使用模式方法时,应该选择iOS作为客户端类型。目前正试图让一个C#示例工作,在他们完成测试后,安装的应用程序运行在台式计算机或手持设备上。您可以为Android、Chrome、iOS和其他已安装的应用程序创建OAuth 2.0凭据。就我个人而言,我更喜欢其他类型。试着联系演示的作者,确保他们乐意提供帮助。我以前没见过,所以可能没什么帮助。似乎没有使用C#的Google.Net客户端库。所以我的样品也帮不了什么忙。改用
redirect\u uri=eu.myapp:
很幸运。注意后面的分号。根据,URI的scheme和path组件之间用分号分隔。@remylebeau尝试过,但没有成功。然后我对应用程序做了一些更改,使其在自定义端口()上侦听。在这两种情况下都存在相同的问题-我只得到一个“重定向uri不匹配”错误)。