我一定是错过了什么!
我一直在尝试使用新的(对我来说是新的,来自delphi xe2环境)TOAuth2Authenticator、TRESTClient、TRESTRequest、TRESTResponse组件来刷新过期的OAUTH2令牌
我已经使用现有的已知值设置了以下身份验证器属性
- ClientID
- 客户秘密
- Scope
- AccessToken端点
- 授权端点
- 重定向端点
- 访问令牌
- 访问令牌过期
- 刷新令牌
并且可以成功从REST服务器访问资源,直到令牌过期.
我推测(看起来是错误的)如果我尝试对服务器执行请求,并且令牌已过期,则应该有足够的详细信息让组件意识到令牌已过期并在需要时刷新它。
我认为没有可以调用的隐藏/未记录的“RefreshExpiredToken”方法?
任何正确方向的指针将不胜感激:-)
Thanks
我最终通过破坏 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)