3

Access 2007 VBA で WinHTTP を使用して、Cookie ログイン資格情報 accountを必要とするアイテムのリストを取得しています。

まず、 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は、ログインの成功後に HTTP サーバーから返された Set-Cookie を保存します。

次に、ログインしたユーザーのみがアクセスできる機密ページを取得する必要があります: 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も変更されました。

これは、Cookie に基づく認証ではなく、有名な基本認証、NTLM 認証、ダイジェスト認証、および Kerberos 認証などの Windows/OS にリンクされた認証のみを対象としているため、テスト済みで効果はありません。

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

以前に認証された資格情報を使用するために、Set-Cookie 以外にヘッダーとしてリモート サーバーに送信するものは何ですか?

サーバーは、typo3 CMS フレームワークを使用します。

4

1 に答える 1

4

この半日で、アレックス K.の助けのおかげで、以前のログイン資格情報を後続のリクエストに使用する方法をようやく理解しました. fiddler2は、HTTP ヘッダーの世界に入る扉を開きました. 今日私のために働いたことを共有したいと思います。

この作業は、URL1 を介してログインし、資格情報が必要な URL2 の HTML コンテンツをフェッチするという 2 つのステップで構成されます。

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. ユーザー名/パスワードで保護された URL2 のコンテンツを取得します。

'
' 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

2 番目のステップで、HTTPS サーバーに送信される 2 つの追加ヘッダーの使用法に注意してください。

「接続」、「キープアライブ」

「User-Agent」、「私のふりをしているナビゲーター blabla...」

それらがないと、URL2 を正常に取得できませんでした。代わりに、適切に構成された Web サイトは、認証のために再度 URL1 にリダイレクトします。

つまり、取得したログイン資格情報を再利用するには、セッションにキープアライブ接続が必要です。

これは、httpプロトコルとhttpsプロトコルのどちらでも同じように機能します。

HTML ログイン入力フィールド名は、ターゲット サイト (ここではusernamepassword ) によって異なります。Web サイトの考案者は、ユーザーパスなどの言葉を使用する場合があります。ログインユーザーログインパス; ... ログインフォームのソースコードを見れば、これは簡単に理解できます。

于 2013-10-10T18:06:45.277 に答える