使用VBA使用凭据访问Web服务

时间:2019-01-24 10:07:37

标签: vba ms-access internet-explorer

我正在为Access使用更长的脚本,有一次需要检查Web服务中文件的最新版本(文件名)。只能通过具有https://webservice.example.com:1234/Server/test.jsp?parameter=value之类的URL的浏览器访问此Web服务,然后必须使用弹出的标准浏览器用户名密码进行身份验证。 当然,如果我改用https://user:password@webservice.example.com:1234/Server/test.jsp?parameter=value之类的方法,则可以跳过此弹出窗口。 (请注意,此时的安全性与密码无关,仅是为了拥有密码而存在,并且完全可以将其存储为明文)

此刻,我已经使用以下工作代码从另一个代码中获取信息  网站:

Dim appIE As Object
Dim sURL as String, infoStr as String
Set appIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 'class id of InternetExplorerMedium
sURL = "https://webservice.example.com:1234/Server/test.jsp?parameter=value"
With appIE
    .Navigate sURL
    .Visible = False
End With

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

infoStr = appIE.Document.getElementsByTagName("body").item.innerText

但是,如果我像在浏览器中那样将凭据添加到URL, sURL = "https://user:password@webservice.example.com:1234/Server/test.jsp?parameter=value" 我将收到以下错误:

  

运行时错误'-2146697202(800c000e)':对象的方法'navigate'   “ IWebBrowser2”失败

有人知道我添加凭据的原因为什么会失败,或者有人知道如何以不同的方式进行操作吗?

1 个答案:

答案 0 :(得分:1)

如果您的网站需要基本身份验证,则使用基本身份验证标头进行身份验证相对容易。

我们需要能够对内容进行Base64编码,因此首先我们需要为此定义一个辅助函数:

Public Function ToBase64(Bytes() As Byte) As String
    Dim XMLElement As Object
    Set XMLElement = CreateObject("Msxml2.DOMDocument.6.0").createElement("tmp")
    XMLElement.DataType = "bin.base64"
    XMLElement.nodeTypedValue = Bytes
    ToBase64 = Replace(XMLElement.Text, vbLf, "")
End Function

然后是创建基本身份验证标头的第二个助手:

Public Function CreateBasicAuthHeader(Username As String, Password As String) As String
    'Assuming ASCII encoding, UTF-8 is harder
    CreateBasicAuthHeader = "Authorization: Basic " & ToBase64(StrConv(Username & ":" & Password, vbFromUnicode))
End Function

快速验证显示?CreateBasicAuthHeader("Aladdin", "OpenSesame")返回Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l,这是根据Wikipedia的预期标头

然后,您可以在Navigate方法中使用它:

Dim appIE As Object
Dim sURL as String, infoStr as String
Set appIE = GetObject("new:{D5E8041D-920F-45e9-B8FB-B1DEB82C6E5E}") 'class id of InternetExplorerMedium
sURL = "https://webservice.example.com:1234/Server/test.jsp?parameter=value"
With appIE
    .Navigate sURL, Headers:=CreateBasicAuthHeader("MyUsername", "MyPassword")
    .Visible = False
End With

Do While appIE.Busy Or appIE.ReadyState <> 4
    DoEvents
Loop

infoStr = appIE.Document.getElementsByTagName("body").item.innerText

这假设服务器要么期望ASCII编码,要么您的用户名和密码都只是ASCII字符,并且服务器期望UTF-8编码。