После некоторых тестов я обнаружил еще одну ошибку, связанную со следующей темой: 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