vb.net REST API POST 调用的 (OAuth) 授权请求标头中的不记名令牌
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18533355/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Bearer token in the (OAuth) Authorization request header for REST API POST call
提问by StealthRT
Hey all i am trying to figure out how to do this OAuth authorization token for a REST API POST call.
大家好,我想弄清楚如何为 REST API POST 调用执行此 OAuth 授权令牌。
The documents state:
文件指出:
With a valid access token, your app can make calls to any Yammer API endpoint by sending the access token as a “Bearer” token in the “Authorization” request header.
GET /api/v1/messages/following.json HTTP/1.1
Host: www.yammer.com
Authorization: Bearer abcDefGhiFor
more details on the “Bearer” token refer to [enter link description here][1]
If the access token expires or the user de-authorizes your app, the API request will return an HTTP 401 with the following error in the body of the response.
{
"response": {
"message": "Token not found.",
"code": 16,
"stat": "fail"
}
}
Your app can request a new access token by re-running the appropriate flow if this error occurs.
如果发生此错误,您的应用程序可以通过重新运行适当的流程来请求新的访问令牌。
Currently my VB.net code is this:
目前我的 VB.net 代码是这样的:
Dim request As HttpWebRequest
Dim response As HttpWebResponse = Nothing
Dim reader As StreamReader
Dim address As Uri
Dim data As StringBuilder
Dim byteData() As Byte
Dim postStream As Stream = Nothing
address = New Uri("https://www.yammer.com/api/v1/messages.json")
request = DirectCast(WebRequest.Create(address), HttpWebRequest)
request.Method = "POST"
request.Headers("Authorization") = "Bearer " & yammerAPI.userToken
request.ContentType = "application/json"
request.Host = "www.yammer.com"
Dim body As String = "test"
Dim replied_to_id As Integer = 123456789
Dim group_id As Integer = 123456789
data = New StringBuilder()
'data.Append("&replied_to_id=" & HttpUtility.UrlEncode(replied_to_id))
data.Append("group_id=" & HttpUtility.UrlEncode(group_id))
data.Append("&body=" & HttpUtility.UrlEncode(body))
byteData = UTF8Encoding.UTF8.GetBytes(data.ToString())
request.ContentLength = byteData.Length
Try
postStream = request.GetRequestStream()
postStream.Write(byteData, 0, byteData.Length)
Finally
If Not postStream Is Nothing Then postStream.Close()
End Try
Try
response = DirectCast(request.GetResponse(), HttpWebResponse)
reader = New StreamReader(response.GetResponseStream())
Debug.Print(reader.ReadToEnd())
Finally
If Not response Is Nothing Then response.Close()
End Try
I keep getting an error of: The remote server returned an error: (401) Unauthorized.
我不断收到错误消息:远程服务器返回错误:(401) 未经授权。
I found this in a following Stackoverflow posting:
我在以下Stackoverflow 帖子中发现了这一点:
The Yammer APIrequires the OAuth data to be in the header. If you look at their example for Getting Data, you'll see the request looks like.
GET /api/v1/messages/favorites_of/1234 HTTP/1.1 HOST: www.yammer.com
Authorization: OAuth oauth_consumer_key="KsTROcNF1Fx3e1PwA",oauth_token="vlVH7A7DOm9wXuHdv58A",oauth_signature_method="PLAINTEXT",oauth_timestamp="1297383841092",oauth_nonce="1047685618",oauth_verifier="E4F8",oauth_signature="yPsEvDnNPIA8xGCFLvMJ73K0DD9ivMpATJeFOSo%26fSFh9UPkHQ6oRwK5OTne33ltnSnbQ9XrAhA72heg"
The OAuth data is in the Authorization header and not in the URL. The only time you have any OAuth data in the URL is when you do the authorize.
所述Yammer的API需要的OAuth数据是在头中。如果您查看他们的获取数据示例,您将看到请求的样子。
GET /api/v1/messages/favorites_of/1234 HTTP/1.1 主机:www.yammer.com
授权:OAuth的oauth_consumer_key = “KsTROcNF1Fx3e1PwA”,组oauth_token = “vlVH7A7DOm9wXuHdv58A”,oauth_signature_method = “PLAINTEXT”,oauth_timestamp = “1297383841092”,oauth_nonce = “1047685618”,oauth_verifier = “E4F8”,oauth_signature = “yPsEvDnNPIA8xGCFLvMJ73K0DD9ivMpATJeFOSo%26fSFh9UPkHQ6oRwK5OTne33ltnSnbQ9XrAhA72heg”
OAuth 数据位于授权标头中,而不是在 URL 中。URL 中有任何 OAuth 数据的唯一时间是在您进行授权时。
Any help would be great to understand this more!
任何帮助都会很好地理解这一点!
回答by grantay
My recent experience with Oauth suggests the content type should be:
我最近使用 Oauth 的经验表明内容类型应该是:
Request.ContentType = "application/x-www-form-urlencoded"
Request.Method = "POST"
Request.ContentLength = byteArray.Length
Request.ContentType = "application/x-www-form-urlencoded"
Request.Method = "POST"
Request.ContentLength = byteArray.Length
rather than request.ContentType = "application/json"
而不是 request.ContentType = "application/json"

