【问题标题】:How to create not expires token in Dropbox API v2?如何在 Dropbox API v2 中创建未过期令牌?
【发布时间】:2023-01-04 15:18:30
【问题描述】:

如标题所说,Dropbox API最近改版后,Token开始有过期时间了。。

以前如果我不撤销,这个Token是可以永久使用的。 出于安全原因,可能会添加过期时间。

但是,这对我的应用来说很不方便。我将需要上传很长时间的文件(一次可能超过一个月)。

根据目前的API,我只能反复刷新令牌以保持令牌不会过期......

有谁知道在当前的 Dropbox API 中是否还有办法创建一组不会过期的令牌?

【问题讨论】:

  • 我有同样的问题,我迁移到谷歌驱动器,它便宜多了

标签: dropbox-api


【解决方案1】:

Dropbox 正在切换为仅颁发短期访问令牌(和可选的刷新令牌),而不是长期访问令牌。你可以找到more information on this migration here

不过,应用程序仍然可以通过请求“离线”访问来获得长期访问权限,在这种情况下,应用程序会收到一个“刷新令牌”,该令牌可用于根据需要检索新的短期访问令牌,而无需进一步的手动用户干预。您可以在the OAuth Guideauthorization documentation 中找到更多信息。

作为参考,虽然现在不赞成创建新的长期访问令牌,但我们目前没有计划禁用现有的长期访问令牌。 (如果情况发生变化,我们当然会提前宣布。)在这种情况下,您可以继续使用现有的长期访问令牌(如果有的话)而不会中断。另请注意,更改后您将无法创建新的长期访问令牌。

虽然更改于 2021 年 9 月 30 日开始,但我们正在逐步发布它,因此您可能直到现在才发现您的应用受到影响。一旦它应用于您的应用程序,它就会适用,而不管您的应用程序的“访问令牌过期”设置如何,并且该设置可能不再适用于您的应用程序。

【讨论】:

    【解决方案2】:

    这是获取刷新令牌所需要做的所有事情,代码 sn-ps 在C#

    第1步: 访问以下网址并完成步骤。在最后一步,您应该看到屏幕上打印了Access Code Generated,复制代码。

    https://www.dropbox.com/oauth2/authorize?client_id=YOUR_APP_KEY&response_type=code&token_access_type=offline
    

    第2步:使用以下代码获取刷新令牌:(注意:你只需要做一次)

    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.dropbox.com/oauth2/token"))
        {
            var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("YOUR_APP_KEY:YOUR_APP_SECRET"));
            request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}"); 
    
            var contentList = new List<string>();
            contentList.Add("code=ACCESS_CODE_FROM_STEP_1");
            contentList.Add("grant_type=authorization_code");
            request.Content = new StringContent(string.Join("&", contentList));
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded"); 
    
            var response = await httpClient.SendAsync(request);
            // process the response
        }
    }
    

    响应应该是这样的:

    {
        "uid": "XXXXXXXX",
        "access_token": "XXXXXXXX",
        "expires_in": 14400,
        "token_type": "bearer",
        "scope": "files.content.read files.content.write",
        "refresh_token": "XXXXXXXX",
        "account_id": "dbid:XXXXXXXX"
    }
    

    您正在寻找refresh_token你应该安全地存放它

    步骤 3:任何时候你需要一个新的访问令牌,运行下面的代码:

    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), $"https://api.dropbox.com/oauth2/token"))
        {
            var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("YOUR_APP_KEY:YOUR_APP_SECRET"));
            request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");
    
            var contentList = new List<string>();
            contentList.Add("refresh_token=REFRESH_TOEKN");
            contentList.Add("grant_type=refresh_token");
            request.Content = new StringContent(string.Join("&", contentList));
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
    
            var res = httpClient.SendAsync(request).Result;
            // process the response
        }
    }
    
    

    响应应该是这样的:

    {
        "access_token": "XXXXXXXX",
        "token_type": "bearer",
        "expires_in": 14400
    }
    

    您正在寻找access_token。还要注意 expires_in 值,您可以而且可能应该将 access_token 存储在某种内存缓存中,以防止在每次 API 调用时请求新令牌。


    这是用于获取新刷新令牌的 curl

    curl https://api.dropbox.com/oauth2/token -d grant_type=refresh_token -d refresh_token=<REFRESH_TOKEN> -u <APP_KEY>:<APP_SECRET>
    

    【讨论】:

      【解决方案3】:

      我刚刚写了一个代码来做到这一点 :) 希望大家喜欢! https://github.com/nhakhtn/dropbox-api-long-term-refresh-token

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多