Delphi Google 使用 Indy HTTP 获取 400 错误请求的 oauth2 令牌请求
Delphi Google oauth2 token request using Indy HTTP get 400 Bad Request
我正在尝试使用 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;
编辑:
我将接受 header 更改为我在别处找到的设置。
我将 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
我解决了!
Indy 是问题所在。
我改用了 synapse 4.0 组件,并在 10 分钟内让它运行起来。
那一天半我再也回不来了。谢谢印地:(
别让自己头疼了。获取 Delphi 的 Clever Internet Suite。因为,狗屎开发者不明白 SSL HTTP 客户端是这样一个基本要求。他们只是继续建议只使用 HTTP 客户端。忘记 Indy 和 Synapse。我不属于 CIS,但属于我的 2 美分。与我的 XE5 完美配合。
我的代码使用 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;
我正在尝试使用 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;
编辑:
我将接受 header 更改为我在别处找到的设置。
我将 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
我解决了!
Indy 是问题所在。
我改用了 synapse 4.0 组件,并在 10 分钟内让它运行起来。
那一天半我再也回不来了。谢谢印地:(
别让自己头疼了。获取 Delphi 的 Clever Internet Suite。因为,狗屎开发者不明白 SSL HTTP 客户端是这样一个基本要求。他们只是继续建议只使用 HTTP 客户端。忘记 Indy 和 Synapse。我不属于 CIS,但属于我的 2 美分。与我的 XE5 完美配合。
我的代码使用 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;