Получение токена аутентификации после запроса HttpSendRequest - PullRequest
1 голос
/ 21 апреля 2010

Следующий код будет входить в мое приложение на сервер.Этот сервер вернет маркер аутентификации, если авторизация прошла успешно.Мне нужно использовать этот токен для запроса информации на сервере.

  egressMsg := pchar('email='+LabeledEdit1.text+'&&password='+MaskEdit1.Text+#0);
  egressMsg64 := pchar(Encode64(egressMsg));

  Reserved := 0;

  // open connection
    hInternetConn := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, NIL, NIL, 0);

  if hInternetConn = NIL then
  begin
    ShowMessage('Error opening internet connection');
    exit;
  end;

  // connect
  hHttpSession := InternetConnect(hInternetConn, 'myserver.com',
    INTERNET_DEFAULT_HTTP_PORT, '', '', INTERNET_SERVICE_HTTP, 0, 0);

  if hHttpSession = NIL then
  begin
    ShowMessage('Error connecting');
    exit;
  end;

  // send request
  hHttpRequest := HttpOpenRequest(hHttpSession, 'POST',
      '/myapp/login', NIL, NIL, NIL, 0, 0);

  if hHttpRequest = NIL then
  begin
    ShowMessage('Error opening request');
    exit;
  end;

  label2.caption := egressMsg64 + '    '+inttostr(length(egressMsg64));
  res := HttpSendRequest(hHttpRequest, Nil,
        DWORD(-1), egressMsg64, length(egressMsg64));

  if not res then
  begin
    ShowMessage('Error sending request ' + inttostr(GetLastError));
    exit;
  end;

  BufferSize := Length(infoBuffer);

  res := HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE, @infoBuffer, BufferSize, Reserved);

  if not res then
  begin
    ShowMessage('Error querying request ' + inttostr(GetLastError));
    exit;
  end;

  reply := infoBuffer;
  Memo1.Lines.Add(reply);

  if reply <> '200' then
  begin
    //error here
  end;

  // how to I get the token here!!!!

  InternetCloseHandle(hHttpRequest);
  InternetCloseHandle(hHttpSession);        
  InternetCloseHandle(hInternetConn);

Как мне получить этот токен?Я попытался запросить cookie, я попробовал InternetGetCookie () и многое другое.Код приветствуется

Спасибо

Джесс

РЕДАКТИРОВАТЬ

Я обнаружил, что если вы используете InternetReadFile, вы можете получить этот токен.Однако этот токен выходит в виде массива байтов.Позже его трудно использовать для отправки на сервер ... кто-нибудь знает, как преобразовать массив байтов в pchar или строку?

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Разве это не должно быть 'Chr (token2 [i-1])' для обычных массивов на основе нуля?

В качестве альтернативы, если предположить не-Unicode Delphi, вы можете использовать:

SetLength(strtoken, Reserved2);
CopyMemory(@strtoken[1], @token2[0], Reserved2);

NB. В Unicode Delphi это будет нарушено, если вы не объявите strtoken как AnsiString
Для Delphi с поддержкой Юникода используйте TEncoding.ASCII.GetString

0 голосов
/ 22 апреля 2010

вот оно:

  if not InternetReadFile(hHttpRequest, @token2, sizeof(token2), Reserved2) then
    Memo1.Lines.Add('error = ' + inttostr(GetLastError))
  else
  begin
    for i:=1 to Reserved2 do
      strtoken := strtoken + Chr(token2[i]);

    Memo1.Lines.Add('token = '+strtoken);
    Memo1.Lines.Add('recevied = '+inttostr(Reserved2));
  end;

token2 - это массив байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...