Последующий запрос WinHTTP VBA не может использовать предыдущие учетные данные для входа?

Я использую WinHTTP в Access 2007 VBA, чтобы получить список элементов, для которых требуется учетная запись для входа в файлы cookie.

Сначала я вхожу в систему через https://www.example.com/login.php со следующим:

  Dim strCookie As String, strResponse As String, _
    strUrl As String
'
  Dim xobj As Object
'
  Set xobj = New WinHttp.WinHttpRequest
'
  strUrl = "https://www.example.com/login.php"
  xobj.Open "POST", strUrl, False
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
  xobj.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  xobj.Send "username=johndoe2&password=mypassword"
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

Содержание strResponse указывает, что мой логин в порядке, поскольку в этой строке приветствуется johndoe2. strCookie сохраняет Set-Cookie, возвращаемый HTTP-сервером после успешного входа в систему.

Затем мне нужно получить конфиденциальную страницу, доступную только для зарегистрированного пользователя: https://www.example.com/secret-contents.php. Я делаю это с предыдущим заголовком Set-Cookie strCookie, повторно отправленным на сервер:

'
' now try to get confidential contents:
'
  strUrl = "https://www.example.com/secret-contents.php"
  xobj.Open "GET", strUrl, False
  xobj.SetRequestHeader "Cookie", strCookie
  xobj.Send
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

К сожалению, это не удалось, поскольку новый strResponse указывает, что полученный контент не является обязательным, а скорее снова является страницей входа. Также изменился strCookie.

Это было протестировано и не дало никакого эффекта, так как это только для связанной аутентификации Windows / OS, такой как известная базовая аутентификация, NTLM, дайджест и Kerberos, а не для аутентификации на основе файлов cookie:

xobj.SetCredentials "johndoe2", "mypassword", 0

Что еще отправлять в виде заголовков на удаленный сервер, кроме Set-Cookie, чтобы использовать ранее сертифицированные учетные данные?

Сервер использует фреймворк typo3 CMS.


person jacouh    schedule 10.10.2013    source источник
comment
Используйте такой инструмент, как Fiddler, чтобы посмотреть, какие заголовки используются при запуске этого процесса в браузере, а затем сравните с тем, как выглядят ваши сгенерированные запросы.   -  person Alex K.    schedule 10.10.2013
comment
У вас есть URL-адрес скрипачей для такого кода, пожалуйста?   -  person jacouh    schedule 10.10.2013
comment
Вуаля: fiddler2.com   -  person Alex K.    schedule 10.10.2013
comment
Спасибо @Alex K. Я установил скрипт 2 и увидел в разделе Cookie / Login вещи, которые strCookie = xobj.GetResponseHeader (Set-Cookie) не получил.   -  person jacouh    schedule 10.10.2013
comment
И более того, эти дополнительные переменные cookie представляют собой строки случайных настроек ...   -  person jacouh    schedule 10.10.2013
comment
@Alex K., я поставил то, что нашел сегодня, в качестве ответа.   -  person jacouh    schedule 10.10.2013


Ответы (1)


За эти полдня я наконец понял, как использовать предыдущие учетные данные для последующих запросов, благодаря помощи Алекса К., fiddler2 открыл дверь в мир заголовков HTTP. Я хотел бы поделиться тем, что сработало для меня сегодня.

Работа состоит из 2 шагов: авторизация через URL1 и получение HTML-содержимого URL2, необходимого для учетных данных.

1. Войдите в систему через URL1, оставив такой же, как в вопросе:

  Dim strCookie As String, strResponse As String, _
    strUrl As String
'
  Dim xobj As Object
'
  Set xobj = New WinHttp.WinHttpRequest
'
  strUrl = "https://www.example.com/login.php"
  xobj.Open "POST", strUrl, False
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
  xobj.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  xobj.Send "username=johndoe2&password=mypassword"
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

2. Получите содержимое URL-адреса, защищенного именем пользователя / паролем2:

'
' now try to get confidential contents:
'
  strUrl = "https://www.example.com/secret-contents.php"
  xobj.Open "GET", strUrl, False
'
' these 2 instructions are determining:
'
  xobj.SetRequestHeader "Connection", "keep-alive"
  xobj.SetRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
'
  xobj.SetRequestHeader "Cookie", strCookie
  xobj.Send
'
  strCookie = xobj.GetResponseHeader("Set-Cookie")
  strResponse = xobj.ResponseText

Можно заметить использование двух дополнительных заголовков, отправленных на сервер HTTTP на втором этапе:

Подключение, проверка активности

User-Agent, мой притворный навигатор блабла ...

без них URL2 не может быть успешно получен, вместо этого правильно настроенный веб-сайт снова перенаправит вас на URL1 для аутентификации.

Одним словом, сеанс должен иметь соединение keep-alive, чтобы повторно использовать полученные учетные данные для входа.

Это одинаково работает для протоколов http и https.

Имена полей ввода для входа в систему HTML зависят от целевого сайта, здесь имя пользователя и пароль. Создатель веб-сайта может использовать такие слова, как пользователь, прошел; loginuser, loginpass; ... вы можете легко понять это, посмотрев исходный код формы входа.

person jacouh    schedule 10.10.2013
comment
привет, не могли бы вы помочь с моим вопросом, за это назначена награда. у меня такая же проблема, но этот код не работает (((stackoverflow.com/questions/58332598/ - person lalachka; 09.11.2019