OAuthUtil.GetAccessToken的代理

时间:2016-03-01 04:56:57

标签: oauth proxy google-api gdata wine

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

该应用程序遵循Google的OAuth文档,用于在Web浏览器中显示登录对话框,获取用户的权限和访问代码,使用访问代码获取访问令牌,然后使用Google Sheet的查询服务获取Google表格。非常简单。工作正常。

在已定义Internet代理的计算机上出现问题。在我的其他应用程序和大部分Google表格API中,我可以定义手动互联网代理。 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

另一个重要方面是我的应用程序也可以在Mac OSX上使用Wine(对于我使用GeckoFX的Web浏览器)。如果在环境中全局定义了Internet代理,那么OAuthUtil工作正常,但这对Wine不起作用。我已经尝试在命令行环境中设置Internet代理,或者在注册表和刷新的系统设置中,仍然在Wine中运行的应用程序仍然不理解已定义代理。因此,必须手动定义代理。

我需要帮助才能找到以下任何一种解决方案: *强制/手动定义OAuthUtil的代理以获取访问令牌的方法 *如果无法像上面那样定义代理,可以使用任何其他方式获取OAuth访问令牌(也许可以使用WebClient?) *在Wine中定义全局Internet代理的一些方法,因此像GData API这样的应用程序可以读取并理解代理设置。虽然我更喜欢在应用程序级别手动定义代理。

任何想法的人?

此致 F.A。

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了。事实证明'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