0

我正在尝试在我的网站上实现文件上传到 Dropbox。但是,在用户单击以授权我的应用程序后,我无法获取 accessToken。

这是我获取 URL 的代码,它返回给客户端以在 Javascript 中打开一个新窗口。

[WebMethod]
public String setUpDropboxOA(String uri, Int32 form_id, String user_auth)
{
    var client = new DropNetClient("xxxxxxxxx", "xxxxxxxxx");
    return client.GetTokenAndBuildUrl(uri);
}

这是我的回调函数:

[WebMethod]
public void AuthorizeDropboxCallback(String oauth_token)
{
    var client = new DropNetClient("xxxxxxxxx", "xxxxxxxxx");
    var accessToken = client.GetAccessToken();
    var jsonObj = new { oauth_token = accessToken.Token, oauth_secret = accessToken.Secret };
    var JSONAuthorizationData = JsonConvert.SerializeObject(jsonObj);
    saveNotification(form_hash, "Dropbox", JSONAuthorizationData, user_id);
}

这是我在 client.GetAccessToken() 上遇到的错误:

Exception of type 'DropNet.Exceptions.DropboxException' was thrown.

DropNet 的文档说 GetAccessToken 有一个重载,允许您指定要使用的令牌,但是,我没有看到。我觉得这是这里的问题,但我不完全确定。

4

2 回答 2

1

正如@albattran 的回答所建议的那样,这是因为您正在创建 DropNetClient 的 2 个不同实例。

client.GetTokenAndBuildUrl(uri);

这个方法实际上做了两件事。1,对 Dropbox 进行 API 调用以获取请求令牌,然后使用该请求令牌创建登录 url。

为了解决这个问题,您需要一种在 Web 请求之间存储请求令牌的方法。

也许考虑使用会话如下所示。

var userToken = client.GetToken();
Session["user_token"] = userToken.Token;
Session["user_secret"] = userToken.Secret;

然后确定回调读取这些会话变量并将它们添加到 DropNetClient 的构造函数重载中。

var token = Session["user_token"];
var secret = Session["user_secret"];
var client = new DropNetClient("XXXX", "XXXX", token, secret);
client.GetAccessToken();
于 2014-09-12T00:35:43.267 回答
0

我认为您的问题是在不同请求之间丢失 DropNetClient 实例的结果,您正在创建两个 DropNetClient 实例。

您需要保留初始令牌形式 GetTokenAndBuildUrl 并在调用 GetAccessToken 时将其恢复。

因为 oAuth 是 3 个步骤:

  1. 获取请求令牌
  2. 发送用户进行授权,并取回验证者
  3. 使用原始请求令牌和验证者获取访问令牌
于 2014-09-11T20:05:24.917 回答