【问题标题】:How to continue an upload after Access Token expire?访问令牌过期后如何继续上传?
【发布时间】:2013-01-31 14:23:19
【问题描述】:

我在 .net 中有一个桌面应用程序,可以将文件上传到 Google Drive。要授权的应用程序使用服务帐户。问题在于大文件(+ 300MB)。上传 1 小时后,应用程序会出现错误消息:

无效的凭据

问题是访问令牌已过期,我不知道如何刷新凭据。

创建DriveService的函数有:

Public Function getAuthenticator() As OAuth2Authenticator(Of AssertionFlowClient)
      Dim SERVICE_ACCOUNT_EMAIL As String = <email>
      Dim SERVICE_ACCOUNT_PKCS12_FILE_PATH As String = <pathFile>
      Dim certificate As X509Certificate2 = New X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, <secret>, X509KeyStorageFlags.Exportable)
      Dim provider = New AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) With {.ServiceAccountId = SERVICE_ACCOUNT_EMAIL, .Scope = DriveService.Scopes.Drive.GetStringValue}
      Dim auth = New OAuth2Authenticator(Of AssertionFlowClient)(provider, AddressOf AssertionFlowClient.GetState)

      auth.LoadAccessToken()
      Return auth
End Function 

Public Function getService() As DriveService
    Return New DriveService(getAuthenticator())
End Function

上传的功能是:

Public Function upload(pathFile As String, fileName As String) As File
       Dim service = getService()
       Dim fi As File = New Data.File()
       Dim byteArray As Byte() = System.IO.File.ReadAllBytes(pathFile)
       Dim stream As System.IO.MemoryStream = New System.IO.MemoryStream(byteArray)

       fi.Title = fileName
       Dim request As FilesResource.InsertMediaUpload = service.Files.Insert(fi, stream, "*/*")
       request.ChunkSize = 1048576

       AddHandler request.ProgressChanged, New Action(Of IUploadProgress)(AddressOf Request_ProgressChanged)

       request.Upload()  

       Dim fileUpload As File = request.ResponseBody

       Return fileUpload
End Function

我阅读了文档,但没有找到此案例的示例。

更新

我将身份验证应用程序更改为使用带有先前保存的刷新令牌的常规 Google 帐户,但结果相同。
这个问题和264的问题有关,我的问题是:上传时间可以超过1小时吗?

【问题讨论】:

    标签: .net google-drive-api google-oauth google-api-dotnet-client


    【解决方案1】:

    除了 Drive OAuth 范围外,您还需要请求“离线”访问类型。当您请求此操作时,身份验证响应将包含一个刷新令牌,您可以使用它在旧令牌过期时获取新的访问令牌。

    库应该透明地处理大部分这些,您可能只需要在您的身份验证请求中传递“离线”范围。

    更多信息:https://developers.google.com/accounts/docs/OAuth2WebServer#offline

    【讨论】:

    • 谢谢@Jason Hall。但我不知道如何包含“离线”范围。我添加了这段代码 ** Dim provider = New AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) With {.ServiceAccountId = SERVICE_ACCOUNT_EMAIL, .Scope = DriveService.Scopes.Drive.GetStringValue, .Header = New AssertionFlowHeader With {.Type = "offline"} }** 但应用失败并出现错误:DotNetOpenAuth.Messasign.ProtocolException:{"发送直接消息或获取响应时发生错误。"}
    • 很抱歉@JasonHall,但我已经修改了 api 文档,但我没有找到在桌面应用程序中将 access_type 设置为“离线”的方法。任何帮助表示赞赏...
    【解决方案2】:

    我不认识您正在使用的库,但如果它可以访问所有 OAuth2 的花里胡哨,您应该能够获得一个刷新令牌,然后在以下位置获得一个新的访问令牌或在到期之前。

    【讨论】:

    • 谢谢@TimBray。我正在使用 适用于 .NET 的 Google API 客户端库。我可以访问 OAuth2 库。我认为问题在于我使用而不是授权网络 Service Account...
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 2021-12-19
    • 2012-05-09
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多