我正在努力从使用Delphi 10.2.2和Indy 10的Google Securetoken获得响应。
我以前也从https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=XXX那里拿到过RefreshToken。这样做效果很好。
现在我尝试用https://securetoken.googleapis.com/v1/token刷新令牌,但不起作用。我总是得到一个403 Forbidden错误。
procedure TForm1.Button2Click(Sender: TObject);
var
l_Response: string;
l_PostData: TIdMultiPartFormDataStream;
l_IRESAccessToken: TIRESAccessToken;
begin
IdHTTP2.Request.ContentType := 'application/json';
IdHTTP2.Request.CharSet := 'utf-8';
l_PostData := TIdMultiPartFormDataStream.Create;
try
l_PostData.AddFormField('grant_type', 'refresh_token');
l_PostData.AddFormField('refresh_token', m_IRESAuth.RefreshToken);
l_PostData.AddFormField('key', 'XXX');
try
l_Response := IdHTTP2.Post('https://securetoken.googleapis.com/v1/token', l_PostData);
l_IRESAccessToken := TJson.JsonToObject<TIRESAccessToken>(l_Response);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
finally
l_PostData.Free;
end;
end;我尝试了指定TLS1.2的IOHandler,并尝试使用JSON对象发送post。另外,我在TIdHTTP.HTTPOptions中设置了hoKeepOrigProtocol标志。到目前为止什么都没有用,我总是得到403 Forbidden。
我用另一个程序试过了,没有问题。
我是不是遗漏了什么?
发布于 2020-05-30 01:50:44
根据谷歌的文档:
Token Service REST API Reference
超文本传输协议请求
POST https://securetoken.googleapis.com/v1/token
请求正文
请求body包含的数据结构如下:
URL编码的表示grant_type=string&code=string&refresh_token=string
TIdHTTP.Post()的TStrings重载以该格式发送数据。这是您需要使用的重载,而不是TIdMultipartFormDataStream重载。
同样,正如你在上面看到的,这个网址不接受你的key作为输入。它只接受grant_type、code (当grant_type不是'authorization_code'时被忽略)和refresh_token。
试着这样做:
procedure TForm1.Button2Click(Sender: TObject);
var
l_Response: string;
l_PostData: TStringList;
l_IRESAccessToken: TIRESAccessToken;
begin
IdHTTP2.Request.ContentType := 'application/x-www-webform-urlencoded';
l_PostData := TStringList.Create;
try
l_PostData.Add('grant_type=refresh_token');
l_PostData.Add('refresh_token=' + m_IRESAuth.RefreshToken);
try
l_Response := IdHTTP2.Post('https://securetoken.googleapis.com/v1/token', l_PostData);
l_IRESAccessToken := TJson.JsonToObject<TIRESAccessToken>(l_Response);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
finally
l_PostData.Free;
end;
end;也就是说,在阅读了上面的文档之后,我不相信您可以将idToken从https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword作为refresh_token发送到https://securetoken.googleapis.com/v1/token。我认为你需要把它作为一个authorization_code发送,然后给你一个refresh_token。因此,如果您还没有这样做,请尝试添加额外的步骤。
发布于 2020-06-08 18:29:17
很抱歉回复晚了,谢谢你的答复。
在咨询了Main-API-Developer之后,他告诉我他们在后台使用Firebase。因此API请求für Google是不同的。
https://cloud.google.com/identity-platform/docs/use-rest-api#section-sign-in-email-password https://cloud.google.com/identity-platform/docs/use-rest-api#section-refresh-token
有了这个缺失的信息,请求就可以正常工作了
procedure TForm1.Button2Click(Sender: TObject);
var
l_Response: string;
l_IRESAccessToken: TIRESAccessToken;
l_Json: string;
l_JsonToSend: TStringStream;
begin
l_Json := '{"grant_type": "refresh_token","refresh_token": "'+ m_IRESAuth.RefreshToken+ '"}';
l_JsonToSend := TStringStream.Create(l_Json, TEncoding.UTF8);
try
try
l_Response := IdHTTP2.Post('https://securetoken.googleapis.com/v1/token?key=XXX, l_JsonToSend);
l_IRESAccessToken := TJson.JsonToObject<TIRESAccessToken>(l_Response);
except
on E: Exception do
ShowMessage('Error on request: '#13#10 + e.Message);
end;
finally
l_JsonToSend.Free;
end;
end;https://stackoverflow.com/questions/62085277
复制相似问题