Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest TOAuth2Authenticator:如何刷新过期令牌?_Rest_Delphi_Oauth 2.0_Delphi 10.1 Berlin - Fatal编程技术网

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

Rest TOAuth2Authenticator:如何刷新过期令牌?,rest,delphi,oauth-2.0,delphi-10.1-berlin,Rest,Delphi,Oauth 2.0,Delphi 10.1 Berlin,我一定是错过了什么 我一直在尝试使用新的(对我来说是新的,来自delphi xe2环境)来刷新过期的OAUTH2令牌,并将其更新为Auth2Authenticator、TRESTClient、TRESTRequest和TRESTResponse组件 我已使用的现有已知值设置了以下验证器属性 客户 客户秘密 范围 AccessTokenEndPoint 授权端点 重定向端点 AccessToken 访问令牌到期 刷新令牌 并且可以从REST服务器成功访问资源,直到令牌过期 我假设(似乎是错误的

我一定是错过了什么

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

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

  • 客户
  • 客户秘密
  • 范围
  • AccessTokenEndPoint
  • 授权端点
  • 重定向端点
  • AccessToken
  • 访问令牌到期
  • 刷新令牌
并且可以从REST服务器成功访问资源,直到令牌过期

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

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

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


谢谢

我最终解决了这个问题,通过将PublicToAuth2Authenticator.ChangeAuthCodeToAccessToken过程更改为PublicToAuth2Authenticator.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;
LClient:=TRestClient.Create(AccessTokenURI);
尝试
LRequest:=TRESTRequest.Create(LClient);//LClient现在“拥有”该请求并将释放它。
LRequest.Method:=TRESTRequestMethod.rmPOST;
lseCredBase64:=字符串(SZFullEncodeBase64(AnsiString(+':'+));
LRequest.AddAuthParameter('grant_type','refresh_token',TRESTRequestParameterKind.pkGETorPOST);
LRequest.AddAuthParameter('refresh_token','U AccessRefreshToken,TRESTRequestParameterKind.pkGETorPOST);
LRequest.AddAuthParameter('Authorization','Basic'+LSecretBase64,TRESTRequestParameterKind.pkHTTPHEADER,[TRESTRequestParameterOption.poDoNotEncode]);
LRequest.执行;
//备忘录1.Lines.Add(LRequest.Response.Content);
如果LRequest.Response.GetSimpleValue('access\u token',LToken),则
开始
_AccessToken:=LToken;
结束;
如果LRequest.Response.GetSimpleValue('refresh\u token',LToken),则
开始
_AccessRefreshToken:=LToken;
//Memo1.Lines.Add('RefreshExpiredToken:New Refresh Token Extracted');
结束;
//检测令牌类型。这对于以后如何使用它很重要
if LRequest.Response.GetSimpleValue('token_type',LToken)
然后_TokenType:=OAuth2TokenTypeFromString(LToken);
//如果由服务提供,字段“expires_in”包含
//访问令牌有效的秒数
如果LRequest.Response.GetSimpleValue('expires\u in',LToken),则
开始
LIntValue:=strotintdef(LToken,-1);
如果(林特值>-1),则
_AccessTokenExpireDT:=IncSecond(现在为LIntValue)
其他的
_AccessTokenExpireDT:=0.0;
//Memo1.Lines.Add('RefreshExpiredToken:New Token Expires'+formatdatetime('hh:nn:ss dd/mm/yyyyy',_AccessTokenExpireDT));
结束;
最后
l客户的处置;
结束;