6

Tôi đang cố xác thực ứng dụng của mình bằng OAuth2 và sử dụng luồng 'ứng dụng đã cài đặt' (nhận mã xác thực và sau đó yêu cầu mã thông báo). Tôi nhận được số 400 bad request error khi yêu cầu mã thông báo trên dòng GetResponse(). Mã của tôi là như sau:Lỗi mã thông báo OAuth của Google - 400 yêu cầu không hợp lệ

Public Sub New() 
    Dim tokenRequest As WebRequest = 
     WebRequest.Create("https://accounts.google.com/o/oauth2/token") 

    Dim requestString As String = "code=<auth-code>" _ 
         & "&client_id=<client_id>" _ 
         & "&client_secret=<client_secret>" _ 
         & "&redirect_uri=http://localhost" _ 
         & "&grant_type=authorization_code" 

    byteArray = StrToByteArray(System.Web.HttpUtility.UrlEncode(requestString)) 

    tokenRequest.Credentials = CredentialCache.DefaultCredentials 
    tokenRequest.Method = "POST" 
    tokenRequest.ContentLength = byteArray.Length 
    tokenRequest.ContentType = "application/x-www-form-urlencoded" 
    Dim dataStream As Stream = tokenRequest.GetRequestStream() 

    dataStream.Write(byteArray, 0, byteArray.Length) 
    dataStream.Close() 

    Console.WriteLine("Getting response...") 

    'Get response 
    Try 
     Dim response As WebResponse = tokenRequest.GetResponse() 

     Console.WriteLine(CType(response, HttpWebResponse).StatusDescription) 

     Dim data As Stream = response.GetResponseStream 

     Array.Resize(byteArray, 4096) 

     Array.Clear(byteArray, 0, byteArray.Length) 

     data.Read(byteArray, 0, byteArray.Length) 

     response.Close() 

    Catch wex As WebException 
     Console.WriteLine("ERROR! : ") 
     Console.WriteLine(wex.Message) 
     Console.WriteLine(wex.Status) 
     Console.WriteLine(wex.Data) 
     Console.WriteLine(wex.InnerException.Message) 
     Console.WriteLine(wex.HelpLink) 
    End Try 
End Sub 

Các chi tiết cụ thể của lỗi là dưới đây:

The remote server returned an error: (400) Bad Request. 
7 
System.Collections.ListDictionaryInternal 
System.NullReferenceException: Object reference not set to an instance of an obj 
ect. 
    at GADownload.GoogleAnalytics..ctor() in ***.vb:line 86 
    at GADownload.Main1.Main(String[] args) in ****.vb:line 18 

Tôi đã có một cái nhìn tại Google GetAccessToken : Bad Request 400Google GData .Net OAuthUtil.GetAccessToken 400 Bad Request nhưng đã không tìm thấy một giải pháp phù hợp với mã này . Tôi đã kiểm tra tất cả các giải pháp được đề xuất và triển khai chúng, nhưng không có may mắn cho đến nay.

Trả lời

0

vẻ như bạn đang không thiết lập giá trị cho các thông số auth-code, client_id hoặc client_secret.

bạn có thể gỡ lỗi các tham số này bằng lệnh curl để xem đây có phải là nguồn của sự cố hay không. ví dụ.

curl -X POST -d "code=<auth-code>&client_id=<client_id>&client_secret=<client_secret>"&grant_type=authorization_code" http://localhost:8000/auth/token          
0

Bạn có thể thử mã hóa URL redirect_uri redirect_uri = http://localhost

Đó là điều duy nhất tôi nhìn thấy trên mã của bạn so với tôi. Đây là mã của tôi tương tự như vb và đang hoạt động

Dim sb As New StringBuilder 
sb.Append("code=").Append(Request.QueryString("code")) _ 
.Append("&client_id=") _ 
.Append(Session.Item("ClientID")) _ 
.Append("&client_secret=") _ 
.Append(Session.Item("ClientSecret")) _ 
.Append("&redirect_uri=") _ 
.Append(HttpUtility.UrlEncode("http://localhost/1.aspx")) _ 
.Append("&grant_type=authorization_code") 
Dim requestGoogle As HttpWebRequest = 
WebRequest.Create("https://accounts.google.com/o/oauth2/token") 
requestGoogle.Method = "POST" 
requestGoogle.ContentType = "application/x-www-form-urlencoded" 
requestGoogle.ContentLength = sb.Length 
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(sb.ToString) 
sb.Clear() 
requestGoogle.GetRequestStream.Write(byteArray, 0, byteArray.Length) 
byteArray = Nothing 
Dim responseGoogle As HttpWebResponse = requestGoogle.GetResponse() 
If responseGoogle.StatusCode = HttpStatusCode.OK Then 
    Dim sr As StreamReader = _ 
    New StreamReader(responseGoogle.GetResponseStream) 
    Dim s As String = sr.ReadToEnd 
    sr.Close() 
    responseGoogle.GetResponseStream.Close() 
    requestGoogle.GetRequestStream.Close() 
    'Response.Write(s) 
End If 
Các vấn đề liên quan