我正在VB.NET中编写对Xero的集成,但是在第一次调用时就停滞了。 我传递了Oauth信息,然后返回错误“远程服务器返回错误:(401)未经授权。”查看该错误,它还显示“协议错误(7)
我尝试使用webclient并将oauth参数传递给查询字符串以及webrequest和httpwebrequest,同时都将oauth参数传递给授权标头。
外面有人可以向我指出正确的方向吗?
最佳问候 卡伦
这是VB.NET项目。 目前为单一表格。 3个按钮。我已经尝试过使用webrequest,httpwebrequest和webclient ....全部给我401错误
Imports System
Imports System.IO
Imports System.Net
Imports System.Text
Imports System.Security.Cryptography
Public Class Form1
' Get an Unauthorised Request Token: https://api.xero.com/oauth/RequestToken
Public StrRequestToken As String = "https://api.xero.com/oauth/RequestToken"
'Redirect a user: https://api.xero.com/oauth/Authorize
Public StrRedirect As String = "https://api.xero.com/oauth/Authorize"
'Swap a Request Token For an Access Token: https://api.xero.com/oauth/AccessToken
Public strSwap As String = "https://api.xero.com/oauth/AccessToken"
'Connect to the Xero API: https://api.xero.com/api.xro/2.0/...
Public StrXeroAPIConnect As String = "https://api.xero.com/api.xro/2.0/"
'https://community.xero.com/developer/discussion/53196360
' we are not using call back
'Oauth say to use oob - but Xero notes say local host
'Public StrCallBackUrl As String = "oob"
Public StrCallBackUrl As String = "https://localhost"
Public StrBaseURL As String = "https://api.xero.com"
Public oauth_token As String = "" ' DONT HAVE FOR XERO
Public oauth_token_secret As String = "" ' DONT HAVE FOR XERO"
'Key from Myapp in xero developer
Public oauth_consumer_key As String = "7RRQZ66JAZSGHH1OQAM6Q6FAQ4FJV4"
Public oauth_consumer_secret As String = "SIZHEBJFNVYO8NMETXDH82E0DM9U5F"
Public oauth_version As String = "1.0"
Public oauth_signature_method As String = "HMAC-SHA1"
Public oauth_signature As String = ""
Public oauth_nonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
Public timeSpan As TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
Public oauth_timestamp As String = Convert.ToInt64(timeSpan.TotalSeconds).ToString()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim result As String
Dim XeroWebClient As WebClient
'9/7/18 set to use TSL 1.2
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
' 9/7/18 based on
'https://stackoverflow.com/questions/10812466/oauth-authentication-with-vb-net
'==========================
' Build the Signature fields
oauth_version = "1.0"
oauth_signature_method = "HMAC-SHA1"
oauth_nonce = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
oauth_timestamp = Convert.ToInt64(TimeSpan.TotalSeconds).ToString()
oauth_signature = GeneraOAuthSignature(StrRequestToken,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_version)
'==========================
'using webclient
XeroWebClient = New WebClient()
XeroWebClient.QueryString.Add("oauth_consumer_Key", oauth_consumer_key)
XeroWebClient.QueryString.Add("oauth_nonce", oauth_nonce)
XeroWebClient.QueryString.Add("oauth_timestamp", oauth_timestamp)
XeroWebClient.QueryString.Add("oauth_signature", oauth_signature)
XeroWebClient.QueryString.Add("oauth_signature_method", oauth_signature_method)
XeroWebClient.QueryString.Add("oauth_version", oauth_version)
XeroWebClient.QueryString.Add("oauth_consumer_secret", oauth_consumer_secret)
XeroWebClient.QueryString.Add("oauth_callback", StrCallBackUrl)
XeroWebClient.Headers.Add("Authorization", "OAuth")
XeroWebClient.BaseAddress = StrBaseURL
XeroWebClient.QueryString.Add("content-type", "application/x-www-form-urlencoded")
Try
result = XeroWebClient.DownloadString(StrRequestToken)
Catch ex As Exception
MsgBox(ex.Message, vbOK, "Exception")
End Try
End Sub
Function GeneraOAuthSignature(ByVal stream_url As String,
ByVal oauth_nonce As String,
ByVal oauth_signature_method As String,
ByVal oauth_timestamp As String,
ByVal oauth_version As String) As String
'The next step is to generate an encrypted oAuth signature which Twitter will use to validate the request.
'To do this, all of the request data is concatenated into a particular format as follows
Dim baseFormat As String = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" &
"&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}"
Dim baseString As String = String.Format(baseFormat,
oauth_consumer_key,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_token,
oauth_version)
baseString = String.Concat("GET&", Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
'Using this base string, we then encrypt the data using a composite of the secret keys and the HMAC-SHA1 algorithm.
Dim compositeKey As String = String.Concat(Uri.EscapeDataString(oauth_consumer_secret), "&", Uri.EscapeDataString(oauth_token_secret))
Dim oauth_signature As String
Dim hasher As HMACSHA1 = New HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey))
Using hasher
oauth_signature = Convert.ToBase64String(hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)))
End Using
Return oauth_signature
End Function
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'9/7/18 set to use TSL 1.2
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
' 9/7/18 based on
'https://stackoverflow.com/questions/10812466/oauth-authentication-with-vb-net
Dim resource_url As String = StrRequestToken
'==========================
' Build the Signature fields
oauth_version = "1.0"
oauth_signature_method = "HMAC-SHA1"
oauth_nonce = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
timeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString()
oauth_signature = GeneraOAuthSignature(resource_url,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_version)
'==========================
'format the header
'Dim headerFormat As String = "OAuth oauth_nonce=""{0}"", oauth_signature_method=""{1}"", oauth_timestamp=""{2}"", oauth_consumer_key=""{3}"", oauth_token=""{4}"", oauth_signature=""{5}"", oauth_version=""{6}"""
'Dim authHeader As String = String.Format(headerFormat, Uri.EscapeDataString(oauth_nonce), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_consumer_key),
'Uri.EscapeDataString(oauth_token), Uri.EscapeDataString(oauth_signature), Uri.EscapeDataString(oauth_version))
'XERO doenst need AuthToken
Dim headerFormat As String = "OAuth oauth_consumer_key=""{0}"", oauth_signature_method=""{1}"", oauth_timestamp=""{2}"", oauth_nonce=""{3}"", oauth_version=""{4}"", oauth_signature=""{5}"""
Dim authHeader As String = String.Format(headerFormat, Uri.EscapeDataString(oauth_consumer_key), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_nonce),
Uri.EscapeDataString(oauth_version), Uri.EscapeDataString(oauth_signature))
'==========================
'Setup the HTTP
ServicePointManager.Expect100Continue = False
Dim req As HttpWebRequest
Dim res As HttpWebResponse
Dim streamReader As StreamReader
Dim responseContent As String = ""
Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
req = HttpWebRequest.Create(resource_url)
'9/7/18 1825 tried adding made no difference
req.ContentType = "application/x-www-form-urlencoded"
req.Timeout = -1
req.Method = "POST"
req.Headers.Add("Authorization", authHeader)
req.PreAuthenticate = True
req.Accept = "application/json"
'
'9/7/18 this is the header that works on Postman
'OAuth oauth_consumer_key = "7RRQZ66JAZSGHH1OQAM6Q6FAQ4FJV4", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1531132797", oauth_nonce = "6XcvObq5LRu", oauth_version = "1.0", oauth_signature = "jeMwlyazkc5BklcYLWyCWfprA3o%3D"
Try
res = DirectCast(req.GetResponse(), HttpWebResponse)
'==========================
' Read the response
streamReader = New StreamReader(res.GetResponseStream(), encode)
While True
responseContent = streamReader.ReadLine()
End While
'==========================
'Close th
'Abort is needed or streamReader.Close() will hang
req.Abort()
streamReader.Close()
streamReader = Nothing
res.Close()
res = Nothing
Catch ex As Exception
MsgBox(ex.Message, vbOK, "Exception")
End Try
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
'9/7/18 set to use TSL 1.2
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12
' 9/7/18 based on
'https://stackoverflow.com/questions/10812466/oauth-authentication-with-vb-net
Dim resource_url As String = StrRequestToken
'==========================
' Build the Signature fields
oauth_version = "1.0"
oauth_signature_method = "HMAC-SHA1"
oauth_nonce = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
timeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString()
oauth_signature = GeneraOAuthSignature(resource_url,
oauth_nonce,
oauth_signature_method,
oauth_timestamp,
oauth_version)
'==========================
'format the header
'Dim headerFormat As String = "OAuth oauth_nonce=""{0}"", oauth_signature_method=""{1}"", oauth_timestamp=""{2}"", oauth_consumer_key=""{3}"", oauth_token=""{4}"", oauth_signature=""{5}"", oauth_version=""{6}"""
'Dim authHeader As String = String.Format(headerFormat, Uri.EscapeDataString(oauth_nonce), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_consumer_key),
'Uri.EscapeDataString(oauth_token), Uri.EscapeDataString(oauth_signature), Uri.EscapeDataString(oauth_version))
'XERO doenst need AuthToken
Dim headerFormat As String = "OAuth oauth_consumer_key=""{0}"", oauth_signature_method=""{1}"", oauth_timestamp=""{2}"", oauth_nonce=""{3}"", oauth_version=""{4}"", oauth_signature=""{5}"""
Dim authHeader As String = String.Format(headerFormat, Uri.EscapeDataString(oauth_consumer_key), Uri.EscapeDataString(oauth_signature_method), Uri.EscapeDataString(oauth_timestamp), Uri.EscapeDataString(oauth_nonce),
Uri.EscapeDataString(oauth_version), Uri.EscapeDataString(oauth_signature))
'==========================
'Setup the HTTP
ServicePointManager.Expect100Continue = False
Dim req As WebRequest
Dim res As WebResponse
Dim streamReader As StreamReader
Dim responseContent As String = ""
Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")
req = WebRequest.Create(resource_url)
req.Timeout = -1
req.Method = "POST"
req.Headers.Add("Authorization", authHeader)
req.PreAuthenticate = True
req.ContentType = "application/x-www-form-urlencoded"
'9/7/18 this is the header that works on Postman
'OAuth oauth_consumer_key = "7RRQZ66JAZSGHH1OQAM6Q6FAQ4FJV4", oauth_signature_method = "HMAC-SHA1", oauth_timestamp = "1531132797", oauth_nonce = "6XcvObq5LRu", oauth_version = "1.0", oauth_signature = "jeMwlyazkc5BklcYLWyCWfprA3o%3D"
Try
res = DirectCast(req.GetResponse(), WebResponse)
'==========================
' Read the response
streamReader = New StreamReader(res.GetResponseStream(), encode)
While True
responseContent = streamReader.ReadLine()
End While
'==========================
'Close th
'Abort is needed or streamReader.Close() will hang
req.Abort()
streamReader.Close()
streamReader = Nothing
res.Close()
res = Nothing
Catch ex As Exception
MsgBox(ex.Message, vbOK, "Exception")
End Try
End Sub