首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TOAuth2Authenticator:如何刷新过期令牌?

TOAuth2Authenticator:如何刷新过期令牌?
EN

Stack Overflow用户
提问于 2017-02-01 13:38:44
回答 1查看 2.3K关注 0票数 4

我一定是漏掉了什么!

我一直在尝试使用新的(无论如何,来自德尔福xe2环境) TOAuth2Authenticator、TRESTClient、TRESTRequest、TRESTResponse组件来刷新过期的TOAuth2Authenticator令牌。

我已经用现有的已知值设置了以下身份验证器属性

  • ClientID
  • ClientSecret
  • 作用域
  • AccessTokenEndPoint
  • AuthorizationEndPoint
  • RedirectionEndPoint
  • AccessToken
  • AccessTokenExpiry
  • RefreshToken

并且可以从REST服务器、成功地访问资源,直到令牌过期为止()。

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

我认为没有隐藏/无文档的"RefreshExpiredToken“方法可以调用吗?

任何指向正确方向的指针都将不胜感激:)

谢谢

EN

回答 1

Stack Overflow用户

发布于 2017-02-06 14:36:15

我最终发现了这一点,通过对publicTOAuth2Authticator.ChangeAuthCodeToAccessToken程序的私生子操作,但我想我会发布我的解决方案,以防它帮助其他人:

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

https://stackoverflow.com/questions/41981226

复制
相关文章

相似问题

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