使用addheader进行授权的经典asp调用api

问题描述 投票:0回答:2

我有一个页面,该页面调用在测试模式下不需要任何授权的api。我们现在正在迁移到需要用户名和密码的实时环境。

api提供程序已发送以下消息:

要访问这些服务,请通过添加以下HTTP标头发送请求。授权:基本Base64Encode(“用户名:密码”)

我不确定语法是否正确,想知道是否有人可以帮助我。

原始呼叫(并且运行良好)是:

Dim xmlobj, username, password
username="myusername"
password="mypassword"
Set xmlobj = server.CreateObject("MSXML2.DOMDocument.3.0")
xmlobj.async = false
xmlobj.setProperty "ServerHTTPRequest", True
xmlObj.AddHeader "Authorization", "Basic", Base64Encode(username & ":" & password)
xmlobj.load(sUrl)

上面的代码抛出错误

/api-test.asp | 20 | 800a000d | Type_mismatch:_'Base64Encode'

任何帮助将不胜感激。

asp-classic
2个回答
0
投票

[就像我在comments中提到的,Authorization标头的语法不正确。

API示例不期望"Base64Encode('username','password')",这是API提供的示例,向您展示如何获取字符串"username:password"并进行Base64编码,这正是Authorization标头所期望的。

但是您仍然需要具有Base64Encode()函数定义才能使代码正常工作。

[Base64Encode()MyASC()功能取自Base64 encode VBS function (vb encoder algorithm), source code

类似的事情应该起作用;

<%
Function Base64Encode(inData)
  'rfc1521
  '2001 Antonin Foller, Motobit Software, http://Motobit.cz
  Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim cOut, sOut, I

  'For each group of 3 bytes
  For I = 1 To Len(inData) Step 3
    Dim nGroup, pOut, sGroup

    'Create one long from this 3 bytes.
    nGroup = &H10000 * Asc(Mid(inData, I, 1)) + _
      &H100 * MyASC(Mid(inData, I + 1, 1)) + MyASC(Mid(inData, I + 2, 1))

    'Oct splits the long To 8 groups with 3 bits
    nGroup = Oct(nGroup)

    'Add leading zeros
    nGroup = String(8 - Len(nGroup), "0") & nGroup

    'Convert To base64
    pOut = Mid(Base64, CLng("&o" & Mid(nGroup, 1, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 3, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 5, 2)) + 1, 1) + _
      Mid(Base64, CLng("&o" & Mid(nGroup, 7, 2)) + 1, 1)

    'Add the part To OutPut string
    sOut = sOut + pOut

    'Add a new line For Each 76 chars In dest (76*3/4 = 57)
    'If (I + 2) Mod 57 = 0 Then sOut = sOut + vbCrLf
  Next
  Select Case Len(inData) Mod 3
    Case 1: '8 bit final
      sOut = Left(sOut, Len(sOut) - 2) + "=="
    Case 2: '16 bit final
      sOut = Left(sOut, Len(sOut) - 1) + "="
  End Select
  Base64Encode = sOut
End Function

Function MyASC(OneChar)
  If OneChar = "" Then MyASC = 0 Else MyASC = Asc(OneChar)
End Function

Dim xmlobj, username, password
username="myusername"
password="mypassword"
Set xmlobj = server.CreateObject("MSXML2.XMLHTTP.3.0")
xmlobj.Open "GET", sUrl, False
xmlobj.setRequestHeader "Authorization", "Basic " & Base64Encode(username & ":" & password)
xmlobj.Send

Dim xmldoc
If xmlobj.status = 200 Then
  Set xmldoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
  xmldoc.Load xmlobj.ResponseXML
Else
  Response.Write "An error occurred!"
End If
%>

0
投票

很幸运,我正在研究同一问题。 ASP经典尝试将标头提交给avalara api。

任何帮助将不胜感激。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.