Согласно документации Google:
Справочник по REST API службы токенов :
HTTP-запрос
POST https://securetoken.googleapis.com/v1/token
Тело запроса
Тело запроса содержит данные со следующей структурой:
представление в кодировке URL
grant_type=string&code=string&refresh_token=string
Перегрузка TStrings
из TIdHTTP.Post()
отправляет данные в этом формате. Это перегрузка, которую вам нужно использовать, а не перегрузка TIdMultipartFormDataStream
.
Кроме того, как вы можете видеть выше, этот URL-адрес не принимает ваш 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
на https://securetoken.googleapis.com/v1/token
как refresh_token
. Я думаю, вам нужно вместо этого отправить его как authorization_code
, что тогда даст вам refresh_token
. Так что попробуйте добавить этот дополнительный шаг, если вы еще этого не сделали.