使用 Indy HTTP 的 Delphi Google oauth2 令牌请求得到 400 错误请求

问题描述 投票:0回答:4

我正在尝试使用 oauth2 从 Google 请求访问和刷新令牌,我得到的只是“HTTP/1.1 400 Bad Request”错误。

我在 Delphi XE5 中使用 IdHTTP 和 IdSSLIOHandlerSocketOpenSSL 处理程序。我已经获得了我的客户端 ID、客户端密钥和 API 密钥。我有授权码。

IdHTTP 已配置:

AllowCookies = True
HandleRedirects = True
HTTPOptions.hoKeepOrigProtocol = True
HTTPOptions.hoNoProtocolErrorException = True

其他一切都是默认的。

我应该事先做些什么,例如身份验证吗?

创建 Win32 应用程序时,redirect_uri 有何相关性?

我们将感激地接受所有帮助。

这是我的代码:

var  Params: TStringList;
     Resp: TStringStream;
     URI: String;
begin

     Params := TStringList.Create;
     Resp := TStringStream.Create;

     try
        URI := 'https://accounts.google.com/o/oauth2/token';

        Params.Add('client_id=' + clientID);
        Params.Add('client_secret=' + clientSecret);
        Params.Add('code=' + authCode);
        Params.Add('redirect_uri=http://localhost');
        Params.Add('grant_type=authorization_code');

        IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
        IdHTTP.Post(URI, Params, Resp);

        Memo1.Lines.LoadFromStream(Resp);
        Memo1.Lines.Insert(0, IdHTTP.ResponseText);

        finally
        FreeAndNil(Params);
        FreeAndNil(Resp);
        end;

end;

编辑:

我将 Accept 标头更改为我在其他地方找到的设置。
我将

charset=utf-8
添加到 Content-Type。
我更换了
clientID
clientSecret

这就是 IdHTTP 发送的内容:

POST /o/oauth2/token HTTP/1.1<br>
Content-Type: application/x-www-form-urlencoded; charset=utf-8<br>
Content-Length: 240<br>
Host: accounts.google.com<br>
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br>
Accept-Encoding: identity<br>
User-Agent: Mozilla/3.0 (compatible; Indy Library)<br>

client_id=clientID&client_secret=clientSecret&code=4%2FtmTyuvpcSMIkoyJcFmicfXQEDpYiw_QilkO2dXv_nUc&redirect_uri=http%3A%2F%2Flocalhost&grant_type=authorization_code

delphi google-oauth access-token indy bad-request
4个回答
3
投票

我解决了!

印地是问题所在。

我改用 synapse 4.0 组件,并在 10 分钟内完成工作。

那是我永远不会回来的一天半。谢谢印地:(


0
投票

省去一些头痛。获取适用于 Delphi 的 Clever Internet Suite。因为,该死的开发人员不明白 SSL HTTP 客户端是这样一个基本要求。他们只是继续建议只使用 HTTP 客户端。忘记 Indy 和 Synapse。除了我的 2 美分,我与 CIS 没有任何关系。与我的 XE5 完美配合。


0
投票

我使用 Delphi XE2 的代码:

var  Params: TStringList;
     Resp: TStringStream;
     URI: String;
     HTTP: TIdHTTP;
     json: string;`enter code here`
     IOHandle: TIdSSLIOHandlerSocketOpenSSL;
begin

   Params := TStringList.Create;
   Resp := TStringStream.Create;

   HTTP := TIdHTTP.Create(nil);
   HTTP.Request.BasicAuthentication := False;
   HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
   IOHandle := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
   IOHandle.SSLOptions.Method := sslvTLSv1_2;
   IOHandle.SSLOptions.Mode := sslmClient;
   HTTP.IOHandler := IOHandle;
   HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
   HTTP.Request.CharSet := 'UTF-8';

   try
      URI := 'https://oauth.hm.bb.com.br/oauth/token';

      Params.Add('client_id=' + CLIENT_ID);
      Params.Add('client_secret=' + CLIENT_SECRET);
      Params.Add('redirect_uri=http://localhost');
      Params.Add('grant_type=client_credentials');

      HTTP.Request.CustomHeaders.Add('Authorization: Basic sua chave aqui');
      HTTP.Request.ContentType := 'application/x-www-form-urlencoded';
      json := HTTP.Post(URI, Params);

      finally
        FreeAndNil(Params);
        FreeAndNil(Resp);
      end;

end;

0
投票

是的。我把时间浪费在了 indy 上的 google 访问令牌上。 我尝试了一切。调试并检查客户端 ID、秘密。 授权码。但是,显示错误 400。

我会放弃使用indy。

© www.soinside.com 2019 - 2024. All rights reserved.