我正在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。找到了一些旧的答案,但开发者控制台显然已经改变了,所以它们不再相关。我错过了什么?
Edit:添加更多信息我构建了一个简单的nodejs服务器,并将其与SSL证书和nginx放在一起,这样我就可以看到实际发送的内容。然后,我使用我的应用程序和示例c#应用程序向它发送令牌请求并监视请求体。唯一可识别的区别是delphi url自动编码代码(4%2Fhky…)而不是4/天…例如)。除此之外,他们看起来一模一样。
我还尝试重写应用程序以侦听本地主机端口,但最终得到相同的结果。有一个delphi演示,他们通过用户登录的嵌入式浏览器来演示google api的使用(它可以工作),但根据api文档,它已经过时了,很快就会消失。此外,我似乎可以很好地管理第一个重定向,但获取实际的令牌失败。
找到我的错误。我注意到,负责发出请求的delphi组件会自动对参数进行编码。在将重定向uri设置为令牌请求的参数之前,我手动对其进行了编码。然后组件再次对它进行编码,这导致它与代码请求中给出的url不同,从而导致uri_mismatch错误。
两个请求的uri也需要相同,因为即使第二个请求不重定向,它仍然使用redirect_uri作为验证参数。