TankAuth Session过期功能使我的Delphi桌面应用程序无效

时间:2013-01-09 16:42:49

标签: delphi authentication codeigniter-2 indy tankauth

我有一个桌面应用程序(使用 Delphi XE2 开发)登录&与 PHP 5 Web应用程序交互(我使用 CodeIgniter 2.1 以及 TankAuth - 两者都是最新版本)

似乎 TankAuth有一个会话过期功能(每隔5分钟启动)以防止会话被劫持。这是一个很好的安全措施,但是......

这也使Delphi应用程序登录无效。更具体地说,我需要更新cookie(我使用Indy 10.4861 ),这意味着我必须每5分钟重新登录

我的Delphi XE2应用程序使用多线程。我使用全局cookie(以避免登录每个线程!),所以我必须解决锁定每5分钟重新登录。

我的探查员清楚地说我需要做点什么!

我的代码如下所示:

TheResponse   := TStringStream.Create;
try
   IdHttp.Get(TheURL, TheResponse);

   if (TheResponse <> nil) And (Pos('login', TheResponse.DataString) <> 0) then
   begin
        OmniLock.Acquire;
        try
           LoginToServer(ServerLogin, UserPassword);
        finally
               OmniLock.Release;
        end;    // try/finally

        // Reload local copie of the cookies manager
        OmniLock.Acquire;
        try
           TheCookieManager.AddCookies(GlobalCookieManager);
        finally
               OmniLock.Release;
        end;    // try/finally
except
      // ...
end;    // try/except

我的问题是:有没有办法让会话过期,但以某种方式捕获已更改的会话过期并更新cookie管理器,而不必重新登录?


修改

只要有新的cookie,全局cookie管理器就会更新:

idHTTP.OnNewCookie := SyncNewCookie;

// ------------------------------------------------------------------------------ //
procedure TMainForm.SyncNewCookie(ASender : TObject; ACookie : TIdCookie; var VAccept : Boolean);
begin
     VAccept := True;

     OmniLock.Acquire;
     try
        GlobalCookieManager.CookieCollection.AddServerCookie(ACookie.ServerCookie, TIdHTTP(TIdCookieManager(ASender).Owner).URL);
     finally
            OmniLock.Release;
     end;    // try/finally
end;

0 个答案:

没有答案