2013-07-22 166 views
6

我试图使用OAuth2验证我的应用程序并使用'安装的应用程序'流(获取授权码,然后请求令牌)。在GetResponse()行上请求令牌时,我得到一个400 bad request error。我的代码如下:Google OAuth令牌错误 - 400错误请求

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 

错误的细节都低于:

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 

我看了一下Google GetAccessToken : Bad Request 400Google GData .Net OAuthUtil.GetAccessToken 400 Bad Request但还没有找到适合于这个代码的解决方案。我已经检查了所有建议的解决方案并实施了它们,但目前为止没有运气。

回答

0

看起来你没有为参数AUTH码设定值,CLIENT_IDclient_secret

您可以使用curl命令调试这些参数,以查看这是否是问题的根源。例如

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

你可以尝试URL编码REDIRECT_URI REDIRECT_URI = http://localhost

这就是我看到您的代码与我的唯一。这里是我的代码,这是类似于VB和正在工作

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 
相关问题