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

时间:2017-02-01 13:38:45

标签: rest delphi oauth-2.0 delphi-10.1-berlin

我必须在这里遗漏一些东西!

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

我已使用

的现有已知值设置以下身份验证器属性
  • 客户端ID
  • ClientSecret
  • 范围
  • AccessTokenEndPoint
  • AuthorizationEndPoint
  • RedirectionEndPoint
  • 的accessToken
  • AccessTokenExpiry
  • RefreshToken

并且可以成功访问REST服务器中的资源,直到令牌过期

我假设(错误地,似乎)如果我尝试对服务器执行请求,并且令牌已过期,则应该有足够的详细信息让组件实现令牌已过期并在其时刷新它需要。

我认为没有隐藏/未记录的" RefreshExpiredToken"我可以打电话的方法吗?

任何指向正确方向的人都会非常感激: - )

由于

1 个答案:

答案 0 :(得分:0)

我最终通过将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;