VB.NET Xero API:OAUTH-有没有人可以与我分享一个可行的示例?

时间:2018-07-09 20:40:09

标签: vb.net oauth xero-api

我正在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

0 个答案:

没有答案