使用grant_type = refresh_token时,不会从Dropbox API返回刷新令牌

问题描述

我已经使用OAuth 2.0(Google云端硬盘,Box,DropBox等)将许多云存储提供商集成到我的应用程序中。我正在使用token_access_type=offline授权并将刷新令牌存储在数据库中,以便可以根据需要获取新的访问令牌。

当我使用DropBox v2 API时,使用/token调用grant_type=refresh_token端点不会在响应中同时返回access_tokenrefresh_token。由于某种原因,我只会得到access_token

我已经验证我正在传递最初用/token调用grant_type=authorization_code时返回的刷新令牌。我的要求如下:

curl https://api.dropBox.com/oauth2/token \
    -d grant_type=refresh_token \
    -d refresh_token=<RefreshTokenReturnedFromAuthorizationCodeExchange> \
    -u <MyAppKey>:<MyAppSecret>

多次发出此请求(使用相同的刷新令牌)每次都会生成一个新的访问令牌,但没有刷新令牌。返回的访问令牌似乎按预期工作。这与其他服务提供商不同,并且似乎与DropBox api文档相矛盾,该文档指出只要我获得refresh_token的授权,就会返回token_access_type=offline

DropBox是否发行旨在像这样重用的刷新令牌? DropBox刷新令牌会过期吗?

解决方法

这是预期的行为。使用grant_type=refresh_token时,the Dropbox API /oauth2/token endpoint也不会返回新的刷新令牌。发出新的刷新令牌是可选的in the OAuth 2 spec

授权服务器可以发布新的刷新令牌

因此,尽管Dropbox API文档确实说:

如果在调用/ oauth2 / authorize时将token_access_type设置为脱机,则响应将包括刷新令牌(refresh_token)。

那实际上只是指最初的grant_type=authorization_code请求,而不是随后的grant_type=refresh_token请求。我会要求团队更新文档以澄清这一点。

Dropbox API刷新令牌本身不会过期,因此您可以重新使用它们(尽管它们可以被用户或应用随时撤消)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...