在Dropbox中使用Google登录时,交换访问令牌代码失败

问题描述 投票:2回答:1

我们有一个使用Dropbox API的应用程序。当用户通过Dropbox OAuth 2流程并使用他们的电子邮件地址和密码登录时,一切正常,我们得到access_token。但是,当用户在Dropbox授权对话框中使用“使用Google登录”流程时,我们会返回code,然后我们尝试交换访问令牌,但请求失败并使用{"error_description": "code doesn't exist or has expired", "error": "invalid_grant"}

这是我们使用的步骤:

1.

var dbx = new Dropbox.Dropbox({ clientId: clientId });
var authUrl = dbx.getAuthenticationUrl('https://www.dropbox.com/1/oauth2/redirect_receiver');

这给了我们网址https://www.dropbox.com/oauth2/authorize?response_type=token&client_id=...&redirect_uri=https://www.dropbox.com/1/oauth2/redirect_receiver

2.在弹出窗口中打开authUrl

3.用户使用“使用Google登录”

4.我们得到一个重定向到下面的URL,其中包含代码:https://www.dropbox.com/google/authcallback?state=...&code=...&scope=...

现在尝试用POST将访问令牌的代码交换到https://api.dropboxapi.com/oauth2/token给我们:{"error_description": "code doesn't exist or has expired", "error": "invalid_grant"}

dropbox dropbox-api
1个回答
1
投票

这里的问题是,鉴于使用Google登录流程,实际上发生了两个OAuth授权流程实例; Google登录流程嵌套在Dropbox应用程序授权流程中。您的应用程序实际上并不需要知道这一点。

https://www.dropbox.com/google/authcallback网址是Dropbox的Google登录流程的重定向网址,因此给出的code适用于Google OAuth流程,而不是Dropbox OAuth流程。尝试将其用于Dropbox OAuth 2流程将因此而失败(因为它实际上来自Google,而不是Dropbox)。

您应该让应用程序等到您自己的重定向URL(在共享代码中,https://www.dropbox.com/1/oauth2/redirect_receiver)被访问,然后从那里获取code并将其交换为Dropbox访问令牌。

© www.soinside.com 2019 - 2024. All rights reserved.