Ошибка маркера доступа API Google .NET без указания маркера обновления - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь настроить класс, который может обернуться вокруг .NET Google API, чтобы я мог использовать токен доступа, который я ранее получил, для доступа к Google Drive пользователя.На данный момент я просто пытаюсь заставить его работать, чтобы мне не требовался токен обновления (подробнее об этом через секунду).Конечная цель состоит в том, чтобы кто-то прошел через веб-страницу, которую я настроил для аутентификации, где я получаю и токен доступа, и токен обновления, напрямую обращаясь к Google Rest API (который я храню в базе данных).Затем они могут запросить загрузку / загрузку файлов на свой диск на другой странице, которая сначала получит соответствующую информацию из базы данных, а затем использует библиотеку API .NET Google при доступе к диску.

Однако, когда я пытаюсь получить доступ к их диску, я получаю следующую ошибку:

Срок действия маркера доступа истек и его невозможно обновить.Ошибки: ошибка обновления, ошибка обновления, ошибка обновления

Я знаю, что токен доступа действителен, потому что я получаю его только несколькими секундами ранее во время тестирования.Вот мой код для настройки службы дисков:

  ' NOTE: Code altered for brevity
  Public Sub Initialize(accessToken As String)
        ' Set up the client secret information based on the default constants
        Dim clientSecrets As New ClientSecrets()
        clientSecrets.ClientId = DEFAULT_CLIENT_ID
        clientSecrets.ClientSecret = DEFAULT_CLIENT_SECRET

        ' Set up a token based on the token data we got
        ' NOTE: Is it OK to leave some strings as NULL?
        Dim token As New Responses.TokenResponse()
        token.AccessToken = accessToken
        token.RefreshToken = ""
        token.TokenType = "Bearer"
        token.IssuedUtc = DateTime.Now
        token.ExpiresInSeconds = 3600
        token.Scope = "drive"
        token.IdToken = ""

        ' Set up a flow for the user credential
        Dim init As New GoogleAuthorizationCodeFlow.Initializer()
        init.ClientSecrets = clientSecrets
        init.Scopes = New String() {DriveService.Scope.Drive}
        init.Clock = Google.Apis.Util.SystemClock.Default

        ' Set up everything else and initialize the service
        Dim baseInit As New BaseClientService.Initializer()
        baseInit.HttpClientInitializer = New UserCredential(New GoogleAuthorizationCodeFlow(init), "user", token)
        baseInit.ApplicationName = APP_NAME

        _service = New DriveService(baseInit)
  End Sub

Вскоре после этого я использую следующий код для запроса папки, чтобы проверить, существует она или нет.

  Private Function GetDriveFolder(folderPath As String, ByRef folderIds As String(), Optional createMissingFolders As Boolean = False, Optional parentFolderId As String = "root") As Data.File
    Dim creatingFolderPath As Boolean = False
    Dim currentFolder As Data.File = Nothing
    Dim folderPathSplit As String() = folderPath.Replace("/", "\").Trim("\").Split("\")
    Dim folderIdList As New List(Of String)
    folderIds = {}

    ' Loop through each folder in the path and seek each out until we reach the end
    For x As Integer = 0 To folderPathSplit.Length - 1
        Dim result As FileList = Nothing

        If Not creatingFolderPath Then
            ' Build a list request which we will use to seek out the next folder
            Dim request As FilesResource.ListRequest = _service.Files.List()
            request.Q = "mimeType='application/vnd.google-apps.folder' and name='" & folderPathSplit(x) & "'"
            If currentFolder Is Nothing Then
                request.Q &= " and '" & EscapeDriveValue(parentFolderId) & "' in parents"
            Else
                request.Q &= " and '" & EscapeDriveValue(currentFolder.Id) & "' in parents"
            End If
            request.Spaces = "drive"
            request.Fields = "files(id, name)"

            ' Execute the search, we should only get a single item back
            ' NOTE: Error thrown on this request
            result = request.Execute()
        End If
        ' So on.....

Итак, я сейчас пытаюсь заставить его работать только с токеном доступа, потому что, если он обновится, мне нужно будет знать, чтобы я мог обновить свою базу данных.Однако, если я включаю маркер обновления, я получаю следующую ошибку:

Ошибка: "unauthorized_client", Описание: "Unauthorized", Uri: ""

IЯ предполагаю, что это как-то связано с тем, как я настроил свое приложение через Dev Console, но если я аутентифицируюсь через Google API Library, запустив браузер, чтобы получить мои учетные данные, все работает нормально.Итак, я действительно не уверен, куда идти отсюда, так как я не нашел ни у кого подобных проблем, и в руководствах не описывается указание вашего собственного токена доступа.

Кроме того, в качестве краткого примечания этоURL, который я использую при аутентификации пользователя:

String.Format("https://accounts.google.com/o/oauth2/v2/auth?client_id={0}&state={1}&redirect_uri={2}&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdrive&access_type=offline&include_granted_scopes=true&prompt=select_account%20consent&response_type=code", GOOGLEAPI_CLIENTID, validateState, redirectUri)

Спасибо за помощь!

1 Ответ

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

Если у вас есть токен доступа, то самым простым способом создания учетных данных Google является использование метода GoogleCredential.FromAccessToken () , передающего ваш токен доступа.

Это возвращает васэкземпляр GoogleCredential, который можно использовать для установки свойства HttpClientInitializer при построении DriveService.

. Если при обращении к службе накопителя по-прежнему возникает ошибка, вероятно, что-то неверно в том, каквы запрашиваете токен доступа.

...