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

Refresh token is not returned from Dropbox API when using grant_type=refresh_token

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

当我使用 Dropbox v2 API 时,使用 grant_type=refresh_token 调用 /token 端点不会 return access_token 和响应中的 refresh_token。由于某种原因,我只得到一个 access_token

我已经验证我正在传递刷新令牌,该令牌是我最初使用 grant_type=authorization_code 调用 /token 时 return 发给我的。我的请求如下所示:

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

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

Dropbox 是否会发布旨在像这样重复使用的刷新令牌? Dropbox 刷新令牌会过期吗?

这是预期的行为。当使用 grant_type=refresh_token, the Dropbox API /oauth2/token endpoint will not also return a new refresh token. Issuing a new refresh token is optional in the OAuth 2 spec:

The authorization server MAY issue a new refresh token

所以,虽然 Dropbox API 文档确实说:

If the token_access_type was set to offline when calling /oauth2/authorize, then response will include a refresh token (refresh_token).

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

Dropbox API 刷​​新令牌本身不会过期,因此您可以 re-use 它们(尽管用户或应用可以随时撤销它们)。