2013-01-07 2 views
0

VB.NET 응용 프로그램에서 웹 리소스를 사용해야합니다. 액세스 토큰을 성공적으로 검색하고이를 사용하여 보호 된 리소스를 호출 할 준비가되었습니다. 그러나 권한이 부여 된 필드가 헤더에 추가되지 않았기 때문에 보호 된 리소스를 호출 할 때마다 401 Unauthorized 응답이 표시됩니다..NET HttpWebRequest oAuth 401 Unconthorized

여기 내 코드입니다.

WebRequest = DirectCast(Net.WebRequest.Create(ApiUri), HttpWebRequest) 
WebRequest.Method = "POST" 
WebRequest.ContentType = "application/json" 
WebRequest.ContentLength = Bytes.Length 
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream 
RequestStream.Write(Bytes, 0, Bytes.Length) 
RequestStream.Close() 
WebRequest.Headers("Authorization") = "OAuth " & _ 
             "oauth_version=""1.0""," & _ 
             "oauth_nonce=""" & Nonce & """," & _ 
             "oauth_timestamp=""" & TimeStamp & """," & _ 
             "oauth_consumer_key=""" & ConsumerKey & """," & _ 
             "oauth_token=""" & Token & """," & _ 
             "oauth_signature_method=""HMAC-SHA1""," & _ 
             "oauth_signature=""" & Signature & """" 
WebResponse = DirectCast(WebRequest.GetResponse(), HttpWebResponse) 

다음으로 Fiddler를 사용하여 요청을 모니터링합니다. 내가 Fiddler에서 본 것은 아래에 표시된 401 응답이있는 요청입니다 (본문 제외). 사방이 인터넷에서 읽은

요청

POST ***url*** HTTP/1.0 
Content-Type: application/json 
Host: ***host*** 
Content-Length: 45 
Connection: Keep-Alive 

응답

HTTP/1.0 401 Unauthorized 
X-Powered-By: PHP/5.3.13 
WWW-Authenticate: Basic realm="***realm***" 
Content-type: application/json 
Content-Length: 79 
Connection: keep-alive 
Date: Mon, 07 Jan 2013 01:13:22 GMT 
Server: lighttpd/1.4.28 

는 HttpWebRequest를 먼저 서버에 도전하고 내가 여기보고 있어요로 401 응답을 수신해야 함을 나타냅니다. 그런 다음 헤더에 추가 된 인증 필드를 사용하여 다시 시도하고 200 OK 응답을 받아야합니다. 이 두 번째 부분은 발생하지 않습니다. 어떻게 제대로 작동하는지 이해하지 않습니까? 아니면 제가 잘못한 것을하고 있습니까?

+1

기존 oAuth 라이브러리 (http://oauth.net/code/)를 사용해보십시오. 그것을 손으로하는 것은 아마도 당신을 미치게 만들 것입니다. – Jason

+0

답변 해 주셔서 감사합니다. 이미 해당 사이트의 코드를 사용하고 있습니다. 나는 실제로 oAuth 댄스 전체가 제대로 작동하도록했습니다. 그것은 문제가 아닙니다. 나는 문제가 심지어 oAuth와 관련이 있다고 믿지 않는다. (나는 그것을 완성을 위해 포스트에 포함시켰다.) 문제는 HttpWebRequest와 관련이 있으며 서버와 통신하는 방법입니다. – user1227445

+0

프록시를 사용하고 있습니까? –

답변

0

스트림이 아닌 BinaryWriter를 사용하여 콘텐츠를 추가해야한다고 밝혀졌습니다.

이렇게 대신.

WebRequest.ContentLength = Bytes.Length 
Dim RequestStream As IO.Stream = WebRequest.GetRequestStream 
RequestStream.Write(Bytes, 0, Bytes.Length) 
RequestStream.Close() 

이렇게하십시오.

Using Writer As New IO.BinaryWriter(WebRequest.GetRequestStream) 
    Writer.Write(Bytes) 
End Using 
+0

GetRequestStream 전에 헤더를 추가하는 것도 효과가 있다고 생각합니다. – noobie

관련 문제