OAuthUtil.GetAccessToken的代理

OAuthUtil.GetAccessToken的代理,oauth,proxy,google-api,gdata,wine,Oauth,Proxy,Google Api,Gdata,Wine,我已经设置了一个功能完善的应用程序(在VB中),允许用户访问他的谷歌表单 该应用程序遵循Google的OAuth文档,在web浏览器中显示登录对话框,获取用户权限和访问代码,使用访问代码获取访问令牌,然后使用Google Sheet的查询服务获取Google Sheets。很简单。很好 问题发生在定义了internet代理的计算机上。在我的应用程序的其余部分和大多数GoogleSheetsAPI中,我可以定义一个手动internet代理。GData的RequestFactory允许手动配置代理服

我已经设置了一个功能完善的应用程序(在VB中),允许用户访问他的谷歌表单

该应用程序遵循Google的OAuth文档,在web浏览器中显示登录对话框,获取用户权限和访问代码,使用访问代码获取访问令牌,然后使用Google Sheet的查询服务获取Google Sheets。很简单。很好

问题发生在定义了internet代理的计算机上。在我的应用程序的其余部分和大多数GoogleSheetsAPI中,我可以定义一个手动internet代理。GData的RequestFactory允许手动配置代理服务器。据我目前所知,唯一不支持的代码行是用于获取访问令牌的OAuthUtil库。它不允许定义internet代理服务器,因此无法解析代理环境后面的计算机上的主机。以下是我的伪代码:

Dim parameters As New OAuth2Parameters
parameters.ClientId = CLIENT_ID
parameters.ClientSecret = CLIENT_SECRET
parameters.RedirectUri = REDIRECT_URI
parameters.Scope = SCOPE

>>Show browser window and obtain access code

parameters.AccessCode = login.Token
OAuthUtil.GetAccessToken(parameters)    '<< Point of failure

Dim requestFactory As GOAuth2RequestFactory = New GOAuth2RequestFactory(Nothing, My.Application.Info.ProductName, parameters)
requestFactory.Proxy = GetProxySettings()   '<< my code for defining proxy

myService = New SpreadsheetsService("Application")
myService.RequestFactory = requestFactory
Dim参数作为新的OAuth2参数
parameters.ClientId=客户端ID
parameters.ClientSecret=CLIENT\u SECRET
parameters.RedirectUri=重定向\u URI
parameters.Scope=Scope
>>显示浏览器窗口并获取访问代码
parameters.AccessCode=login.Token

OAuthUtil.GetAccessToken(参数)“我已经弄明白了。“OAuthUtil.GetAccessToken”只使用系统定义的代理。没有办法像RequestFactory支持那样手动定义internet代理。因此,有一个使用WebClient的解决方案:

Try
                '// Get access token from code
                Using WC As New WebClient
                    ' Define proxy
                    WC.Proxy = GetProxySettings()
                    ' Set parameters
                    WC.Headers(HttpRequestHeader.ContentType) = "application/x-www-form-urlencoded"
                    ' Get response
                    Dim postURL = "https://www.googleapis.com/oauth2/v4/token"
                    Dim postParams = "code=" & parameters.AccessCode &
                                     "&client_id=" & Uri.EscapeDataString(CLIENT_ID) &
                                     "&client_secret=" & Uri.EscapeDataString(CLIENT_SECRET) &
                                     "&redirect_uri=" & Uri.EscapeDataString(REDIRECT_URI) &
                                     "&grant_type=authorization_code"
                    Dim responsebody As String = WC.UploadString(postURL, postParams)
                    ' Read response
                    Dim jObj As JObject = JsonConvert.DeserializeObject(responsebody)
                    ' Store token
                    parameters.AccessToken = jObj("access_token").ToString
                    parameters.RefreshToken = jObj("refresh_token").ToString
                    parameters.TokenType = jObj("token_type").ToString
                    parameters.TokenExpiry = Now().AddSeconds(CDbl(jObj("expires_in").ToString))

                End Using
            Catch ex As Exception
                MsgBox("Error obtaining access token: " & ex.Message, MsgBoxStyle.Critical)
                Return Nothing
            End Try