【问题标题】:OAuth authentication with VB.NET使用 VB.NET 进行 OAuth 身份验证
【发布时间】:2014-05-15 18:47:04
【问题描述】:

我正在尝试关注this example 访问 Twitter Stream API (userstream),所以我需要做一些修改,这是我的最终代码:

        'We need to define some details about the request. This includes a unique oauth_nonce parameter which must be generated per request, and a timestamp
        Dim oauth_version As String = "1.0"
        Dim oauth_signature_method As String = "HMAC-SHA1"
        Dim oauth_nonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))
        Dim TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
        Dim oauth_timestamp As Integer = Convert.ToInt64(TimeSpan.TotalSeconds).ToString()

        '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 = "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))
        'baseString = String.Concat(Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
        baseString = Uri.EscapeDataString(stream_url)

        '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

        'The oAuth signature is then used to generate the Authentication header.
        'This requires concatenating the public keys and the token generated above into the following format
        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))

        'We are now ready to send the request, which is the easy part.
        'Note, we must also disable the Expect: 100-Continue header using the ServicePointManager.
        'Without this code, .NET sends the header by default, which is not supported by Twitter
        Dim req As WebRequest
        Dim res As HttpWebResponse
        Dim streamReader As StreamReader
        Dim wait As Integer = 250
        Dim jsonRes As String = ""
        Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")

        ServicePointManager.Expect100Continue = False
        req = WebRequest.Create(stream_url)
        req.Headers.Add("Authorization", authHeader)

        res = DirectCast(req.GetResponse(), HttpWebResponse)
        streamReader = New StreamReader(res.GetResponseStream(), encode)
        While True
            jsonRes = streamReader.ReadLine()

            'Success
            wait = 250
        End While

        'Abort is needed or responseStream.Close() will hang
        req.Abort()
        streamReader.Close()
        streamReader = Nothing
        res.Close()
        res = Nothing

在这一行:res = DirectCast(req.GetResponse(), HttpWebResponse) 我得到一个 401 - Unauthorized,我猜问题可能出在哪里我准备了 OAuth 签名,原来使用的是 POST,我需要 GET,所以我更改了它并尝试了以下 3 个替代方案:

        'baseString = String.Concat("GET&", Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
        'baseString = String.Concat(Uri.EscapeDataString(stream_url), "&", Uri.EscapeDataString(baseString))
        baseString = Uri.EscapeDataString(stream_url)

你能帮我让 Twitter OAuth 在 VB.NET 中工作吗?

目前,Twitterizer 不是一个选项,因为它仅适用于 Visual Studio 2010,而 TwitterVB2.dll 仅适用于 REST API,不适用于流 API,我不知道是否还有其他 第三方库,但此时我更愿意用我自己的代码来解决(那里有太多未维护和不完整的库)。

谢谢

【问题讨论】:

  • 如果您在此 url 中看到第一条评论 thecodeking.co.uk/2011/08/… .NET 有一些编码字符与 Twitter 不同的问题,它已在 Stack-overflow 中提到,但到目前为止还没有找到解决方案跨度>

标签: vb.net twitter


【解决方案1】:

已解决,实际上签名生成正常,因此错误出现在处理请求的方法中,这是我的最终代码,正如我所提到的,它基于this C# one

    Dim resource_url As String
    resource_url = "https://userstream.twitter.com/2/user.json"

    '==========================
    'OBTENCION DEL TOKEN Y SIGNATURE OAUTH

    Dim oauth_version As String = "1.0"
    Dim oauth_signature_method As String = "HMAC-SHA1"
    Dim oauth_nonce As String = Convert.ToBase64String(New ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()))

    Dim timeSpan As TimeSpan = DateTime.UtcNow - New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc)
    Dim oauth_timestamp As String = Convert.ToInt64(timeSpan.TotalSeconds).ToString()

    Dim oauth_signature As String = GeneraOAuthSignature(resource_url, _
                                                          oauth_nonce, _
                                                          oauth_signature_method, _
                                                          oauth_timestamp, _
                                                          oauth_version)
    '==========================
    'FORMATEO DEL ENCABEZADO OAUTH
    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))

    '==========================
    'LLAMADA HTTP
    ServicePointManager.Expect100Continue = False

    Dim req As WebRequest
    Dim res As HttpWebResponse
    Dim streamReader As StreamReader
    Dim contenidoRespuesta As String = ""
    Dim encode As Encoding = System.Text.Encoding.GetEncoding("utf-8")

    req = WebRequest.Create(resource_url)
    req.Timeout = -1
    req.Headers.Add("Authorization", authHeader)

    res = DirectCast(req.GetResponse(), HttpWebResponse)

    '==========================
    'PROCESAR RESPUESTA
    streamReader = New StreamReader(res.GetResponseStream(), encode)
    While True
        contenidoRespuesta = streamReader.ReadLine()

    End While

    '==========================
    'CIERRE DE STREAMS Y COMUNICACIONES
    'Abort is needed or streamReader.Close() will hang
    req.Abort()
    streamReader.Close()
    streamReader = Nothing
    res.Close()
    res = Nothing

地点:

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 = "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

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多