首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Indy10 Google Securetoken always 403

Indy10 Google Securetoken always 403
EN

Stack Overflow用户
提问于 2020-05-29 19:48:13
回答 2查看 99关注 0票数 0

我正在努力从使用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错误。

代码语言:javascript
复制
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

我用另一个程序试过了,没有问题。

我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 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_typecode (当grant_type不是'authorization_code'时被忽略)和refresh_token

试着这样做:

代码语言:javascript
复制
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;

也就是说,在阅读了上面的文档之后,我不相信您可以将idTokenhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword作为refresh_token发送到https://securetoken.googleapis.com/v1/token。我认为你需要把它作为一个authorization_code发送,然后给你一个refresh_token。因此,如果您还没有这样做,请尝试添加额外的步骤。

票数 1
EN

Stack Overflow用户

发布于 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

有了这个缺失的信息,请求就可以正常工作了

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62085277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档