当前位置: 首页 > 知识库问答 >
问题:

.NET Google API访问令牌失败,未指定刷新令牌

公羊俭
2023-03-14

我试图建立一个类,它可以环绕。NET Google API,这样我就可以使用我以前获得的访问令牌来访问用户的Google驱动器。到目前为止,我只是试图让它工作,这样我就不需要刷新令牌(稍后会有更多)。最终目标是让某人通过我设置的web页面进行身份验证,通过直接调用Google Rest API(我将其存储在数据库中)获得访问令牌和刷新令牌。然后,他们可以请求将文件上载/下载到另一个页面上的驱动器上,该页面将首先从数据库中获取适当的信息,然后在访问驱动器时使用。NET Google API库。

但是,当我试图访问他们的驱动器时,我得到以下错误:

访问令牌已过期,无法刷新。错误:刷新错误,刷新错误,刷新错误

我知道访问令牌是有效的,因为在测试过程中,我只在几秒钟前获得了它。下面是我设置驱动器服务的代码:

  ' 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:“

我猜这与我通过开发控制台配置应用程序的方式有关,但如果我通过Google API库通过启动浏览器来获取我的凭据来进行身份验证,那么一切都很好。所以,我真的不确定从这里到哪里去,因为我没有发现任何人有类似的问题,指南也没有涉及指定您自己的访问令牌。

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个答案

潘俊
2023-03-14

如果您有一个访问令牌,那么创建google凭据的最简单方法是使用传递访问令牌的GoogleRedential.FromAccessStoken()方法。

这将返回一个GoogleCredential实例,在构建DriveService时,可以使用该实例设置HttpClientInitializer属性。

如果您在访问驱动器服务时仍然出现错误,那么您请求访问令牌的方式很可能是不正确的。

 类似资料:
  • 我不熟悉,它代表。我混淆了它的两个术语:访问令牌和刷新令牌。 用户注册/登录站点后,我创建和。 将刷新标记保存在数据库或cookie中。 15分钟后,用户标记访问令牌过期。 如果用户空闲2小时,我将从cookie或DB中删除刷新令牌,否则我将使用刷新令牌续订访问令牌。 有什么优化的方法可以达到这个目的吗?

  • 我已经阅读了JWT和访问令牌和刷新令牌。我知道您必须在很短的时间(分钟)内设置访问令牌过期,并在过期时使用刷新令牌获取新的访问令牌。 我不清楚三件事: 谁检查访问令牌是否过期?客户端是否通过发送过期的访问令牌和刷新来检查并请求新的访问代码? 谁检查刷新令牌是否过期?(显然刷新令牌也需要过期,尽管需要更长的时间才能过期)。 在我看来,如果刷新令牌过期,则必须提示用户重新登录。在某些情况下(移动应用)

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 若授权服务器给客户端颁发了刷新令牌,客户端通过使用按附录B“application/x-www-form-urlencoded”格式在HTTP请求实体正文中发送下列UTF-8字符编码的参数向令牌端点发起刷新请求: grant_type 必需的。值必须设置为“refresh_token”。 refresh_token 必需的。颁发给客户端的刷新令牌。 scope 可选的。如3.3节所述的访问请求的范

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre

  • null 很抱歉太啰嗦了。 提前谢了。