Почему я получаю ошибку 400 (неверный запрос) - PullRequest
0 голосов
/ 16 октября 2018

После получения кода авторизации от Google Api я пытаюсь сделать запрос на получение данных пользователя, но всегда возникает ошибка 400.

Dim objSerializer = New JavaScriptSerializer()
Dim objContent = New NameValueCollection()
Dim strClientId = "****.apps.googleusercontent.com"
Dim strClientSecret = "****"
Dim strTokenUri = "https://accounts.google.com/o/oauth2/token"

Dim objClient = New WebClient()
objClient.Encoding = Encoding.UTF8
objClient.QueryString.Add("code", strCode)
objClient.QueryString.Add("client_id", strClientId)
objClient.QueryString.Add("client_secret", strClientSecret)
objClient.QueryString.Add("redirect_uri", "http://localhost:38815/Info.aspx")
objClient.QueryString.Add("grant_type", "authorization_code")

Dim data = objClient.UploadValues(strTokenUri, "POST", objClient.QueryString)

Dim objResponse As String = Encoding.UTF8.GetString(data)
Dim objGoogleJwtToken = objSerializer.Deserialize(Of GoogleAccessToken)(objResponse)

Ошибка: System.Net.WebException: удаленныйсервер возвратил ошибку: (400) запрос неверен.

ОБНОВЛЕНИЕ Это мои данные сообщения

POST /o/oauth2/token HTTP/1.1
Host: accounts.google.com
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded

code=4%2FewGRFvsrdTHGF698QFq6d359KAPRWc4c-8ipKjJU58X1uk14WNc5uRw45N-c88HtbWkL17wEfLlasdfGRSU&
client_id=****.apps.googleusercontent.com&
client_secret=****&
redirect_uri=http%3A%2F%2Flocalhost%3A38815%2FInfo.aspx&
grant_type=authorization_code

Я получаю следующий результат json:

{
    "error": "invalid_grant",
    "error_description": "Bad Request"
}

1 Ответ

0 голосов
/ 17 октября 2018

После некоторых тестов я обнаружил еще одну ошибку, связанную со следующей темой: https://github.com/morgoth/picasa/issues/39

Даже при корректировке параметра redirect_uri по-прежнему не получался аутентифицированный токен, поэтому я использовал клиент Http для .NET Restsharp и получил следующее работающее решение:

Private Shared Function GetAccessToken3(ByVal strCode As String, ByVal strClientId As String, ByVal strClientSecret As String, ByVal strTokenUri As String) As GoogleAccessToken

    Dim objClient As RestClient
    Dim objIResponse As IRestResponse
    Dim objRequest As RestRequest
    Dim objSerializer As New DataContractJsonSerializer(GetType(GoogleAccessToken))
    Dim objResponse As GoogleAccessToken

    objClient = New RestClient(strTokenUri)
    objClient.Authenticator = New HttpBasicAuthenticator(strClientId, strClientSecret)

    objRequest = New RestRequest(Method.POST)
    objRequest.AddHeader("Content-Type", "application/x-www-form-urlencoded")
    objRequest.AddHeader("Accept", "application/json")

    objRequest.AddParameter("code", strCode, ParameterType.GetOrPost)
    objRequest.AddParameter("client_id", strClientId, ParameterType.GetOrPost)
    objRequest.AddParameter("client_secret", strClientSecret, ParameterType.GetOrPost)
    objRequest.AddParameter("redirect_uri", "http://localhost:38815/Default.aspx", ParameterType.GetOrPost)
    objRequest.AddParameter("grant_type", "authorization_code", ParameterType.GetOrPost)

    objIResponse = objClient.Execute(objRequest)

    If objIResponse.StatusCode <> HttpStatusCode.OK OrElse objIResponse.ErrorException IsNot Nothing Then

        Throw New Exception("Error: " + objIResponse.StatusCode)
    End If

    objResponse = DirectCast(objSerializer.ReadObject(New MemoryStream(Encoding.UTF8.GetBytes(objIResponse.Content))), GoogleAccessToken)

    Return objResponse
End Function

Я проверяю результат токена в JWT Tool

...