2017-02-01 2 views
4

Я должен что-то упустить!TOAuth2Authenticator: Как обновить токен с истекшим сроком действия?

Я играл вокруг попытки обновить просроченный oauth2 маркер, используя новый (новый для меня во всяком случае, исходя из Delphi XE2 среды) TOAuth2Authenticator, TRESTClient, TRESTRequest, компоненты TRESTResponse

Я установил следующие свойства аутентификации диспетчера с существующими известными значениями для

  • ClientID
  • ClientSecret
  • Область
  • AccessTokenEndPoint
  • AuthorizationEndPoint
  • RedirectionEndPoint
  • маркер доступа
  • AccessTokenExpiry
  • RefreshToken

и может успешные доступ к ресурсам с сервера REST, до тех пор, пока маркер истекает.

Я предположил (ошибочно, так кажется), если я попытаюсь выполнить запрос на сервер, а токен истек, должно быть достаточно деталей для того, чтобы компонент понял, что токен истек, и обновить его как и когда это нужно.

Я принимаю его, нет скрытого/недокументированного метода «RefreshExpiredToken», который я могу назвать?

Любые указатели в правильном направлении было бы весьма признателен :-)

Благодарности

ответ

0

В конце концов я понял это, по bastardising процедуру 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; 
Смежные вопросы