当前位置: 首页 > 知识库问答 >
问题:

toauth2authenticator:如何刷新过期的令牌?

郦良才
2023-03-14

我一定是漏掉了什么!

我一直在尝试使用新的(对我来说是新的,来自delphi xe2环境)TOAuth2Authenticator、TRESTClient、TRESTRequest、TRESTResponse组件刷新过期的OAUTH2令牌

    null

我假设(看来是错误的),如果我尝试对服务器执行请求,并且令牌已经过期,那么组件应该有足够的细节来意识到令牌已经过期,并在需要的时候刷新它。

我认为没有隐藏的/未记录的“refreshExpiredToken”方法可以调用?

如有任何正确方向的指示,将不胜感激:-)

谢谢

共有1个答案

怀经赋
2023-03-14

我最终解决了这一问题,通过破坏PublicToAuth2Authticator.ChangeAuthCodeToAccessToken过程,但我想我应该发布我的解决方案,以防它能帮助其他人:

LClient := TRestClient.Create(AccessTokenURI);
try
  LRequest := TRESTRequest.Create(LClient); // The LClient now "owns" the Request and will free it.
  LRequest.Method := TRESTRequestMethod.rmPOST;
  LSecretBase64 := String(SZFullEncodeBase64(AnsiString(<myClientID>+ ':' + <MyClientSecret>)));

  LRequest.AddAuthParameter('grant_type', 'refresh_token', TRESTRequestParameterKind.pkGETorPOST);
  LRequest.AddAuthParameter('refresh_token', _AccessRefreshToken, TRESTRequestParameterKind.pkGETorPOST);
  LRequest.AddAuthParameter('Authorization','Basic '+LSecretBase64, TRESTRequestParameterKind.pkHTTPHEADER, [TRESTRequestParameterOption.poDoNotEncode]  );


  LRequest.Execute;
  //Memo1.Lines.Add(LRequest.Response.Content);

  if LRequest.Response.GetSimpleValue('access_token', LToken) then
  begin
    _AccessToken := LToken;
  end;

  if LRequest.Response.GetSimpleValue('refresh_token', LToken) then
  begin
    _AccessRefreshToken := LToken;
    //Memo1.Lines.Add('RefreshExpiredToken: New Refresh Token Extracted');
  end;

  // detect token-type. this is important for how using it later
  if LRequest.Response.GetSimpleValue('token_type', LToken)
   then _TokenType := OAuth2TokenTypeFromString(LToken);

  // if provided by the service, the field "expires_in" contains
  // the number of seconds an access-token will be valid
  if LRequest.Response.GetSimpleValue('expires_in', LToken) then
  begin
    LIntValue := StrToIntdef(LToken, -1);
    if (LIntValue > -1) then
      _AccessTokenExpireDT := IncSecond(Now, LIntValue)
    else
      _AccessTokenExpireDT := 0.0;

    //Memo1.Lines.Add('RefreshExpiredToken: New Token Expires '+formatdatetime('hh:nn:ss dd/mm/yyyy', _AccessTokenExpireDT));
  end;


finally
  LClient.DisposeOf;
end;
 类似资料:
  • 我已经阅读了跑道文档。我特别考虑了以下关于使用的声明: 此请求返回与上述相同的数据,您可以继续反复执行此操作,以保持应用程序的身份验证,而无需要求用户重新身份验证。 这是否意味着将无限期有效或过期: < li >签发后X天;或者 < li >最后一次使用它获取新的< code>access_token后的X天 编辑:请参阅此跑道线程,该线程提出相同的问题,但似乎没有给出任何关于Oauth2.0协议

  • 当访问Google-Drive时,访问令牌可能过期,我们可以使用刷新令牌获得新的访问令牌。但是,有许多可能的原因,即刷新令牌本身停止工作或过期,请参见: https://developers.google.com/identity/protocols/oauth2#过期 所以我的问题是,如果刷新令牌在6个月后过期了会发生什么,我如何检测它?刷新访问令牌的请求是否在403被禁止的情况下失败,或者返回

  • google oauth2刷新令牌何时过期? 我所说的过期是指过期是因为经过了某个时间跨度(不是因为用户已撤销访问权限或用户已请求新的刷新令牌) 我做了一些研究,没有一个引用官方的谷歌文档(我也找不到一个有效的谷歌文档) 其他一些问题表示,由于时间,它从未过期: 谷歌刷新令牌过期了吗? https://community.fitbit.com/t5/web-api-development/inva

  • 我们决定使用OAuth2从Hazelcast共享会话切换到无状态JWT身份验证/授权,并发现了一个不适合我们下面描述的基础结构的问题。 因此,我们有多个独立的系统,可以通过直接链接访问,即mysite.com/scs1和mysite.com/scs2。 每个scs都有自己的UI和后端,但是“会话”(通过无状态JWT授权实现)必须在多个scs之间有效。 OAuth2授权服务器是一个专用服务器(UAA