Indy10 Google Securetoken всегда 403 - PullRequest
0 голосов
/ 29 мая 2020

Я изо всех сил пытаюсь получить ответ от Google Securetoken, используя Delphi 10.2.2 и Indy 10.

Я получил свой RefreshToken раньше от https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=XXX. Это сработало.

Теперь я пытаюсь обновить sh токен с помощью 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;

Я пробовал IOHandler, который указывает TLS 1.2, и пытался отправить сообщение с объектом JSON. Также я установил флаг hoKeepOrigProtocol в TIdHTTP.HTTPOptions. Пока ничего не работало, всегда получаю 403 Forbidden.

Пробовал с другой программой, никаких проблем нет.

Что-то не хватает?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Согласно документации 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. Так что попробуйте добавить этот дополнительный шаг, если вы еще этого не сделали.

0 голосов
/ 08 июня 2020

Извините за поздний ответ и спасибо за ответ.

После консультации с Main-API-Developer он сказал мне, что они используют Firebase в фоновом режиме. Таким образом, запрос API для 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 -refre sh -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;
...