【问题标题】:TOAuth2Authenticator: How do i refresh an expired token?TOAuth2Authenticator:如何刷新过期的令牌?
【发布时间】:2017-02-01 13:38:44
【问题描述】:

我一定是错过了什么!

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

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

  • 客户 ID
  • ClientSecret
  • 范围
  • AccessTokenEndPoint
  • 授权端点
  • 重定向端点
  • 访问令牌
  • 访问令牌过期
  • 刷新令牌

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

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2017-10-19
      • 1970-01-01
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多