以编程方式将文件上传到Box.com的最佳方式

时间:2013-11-27 20:13:27

标签: upload oauth-2.0 box-api

我已经阅读了整个Box.com开发者api指南并花了几个小时在网上研究这个特定的问题,但我似乎无法找到明确的答案,我不想开始创建一个解决方案,如果我'走错了路。我们有一个生产环境,一旦我们完成文件处理,我们的生产软件系统就会将它们拉上来并将它们保存到本地服务器目录中以便存档。此本地路径无法更改。我的问题是如何以编程方式将这些文件上传到我们的Box.com帐户,以便我们可以在云上存档这些文件?我读到的关于此的所有内容都涉及使用OAuth2来访问我理解的帐户,但它也要求用户登录。由于这是一个不向外部用户公开的内部流程,我希望能够实现自动化,否则对我们来说是不可行的。我没有问题创建程序,每次保存新文件时都会触发,我只需要简化Box.com访问。

3 个答案:

答案 0 :(得分:10)

我刚刚完成了同样的问题,发现目前无法绕过OAuth流程。但是,他们的刷新令牌现在有效期为60天,这应该使任何自定义设置更加坚固。但我仍然认为,必须使用OAuth进行企业设置是一个非常脆弱的实现 - 出于你说的确切原因:某些中间件应用程序必须依赖OAuth身份验证过程。

我的解决方案:

这就是我想出的。以下是各种API文档和视频中列出的相同步骤:

  1. 使用此网址https://www.box.com/api/oauth2/authorize?response_type=code&client_id=[YOUR_CLIENT_ID]&state=[box-generated_state_security_token] (转到https://developers.box.com/oauth/查找原始版本)
  2. 将该网址粘贴到浏览器中并转到
  3. 验证并授予访问权限
  4. 抓取生成的网址:http://0.0.0.0/?state=[box-generated_state_security_token]&code=[SOME_CODE]  并注意“code =”值。
  5. 打开POSTMAN或Fiddler(或其他一些HTTP嗅探器)并输入以下内容:
    • 网址:https://www.box.com/api/oauth2/token
    • 创建URL编码的帖子数据:
      • grant_type = authorization_code
      • client_id = [您的客户ID]
      • client_secret = [您的客户秘密]
      • code =<输入步骤4>
      • 的代码
  6. 发送请求并检索生成的JSON数据:
    {
    "access_token": "[YOUR SHINY NEW ACCESS TOKEN]",
    "expires_in": 4255,
    "restricted_to": [],
    "refresh_token": "[YOUR HELPFUL REFRESH TOKEN]",
    "token_type": "bearer"
    }
    
  7. 在我的应用程序中,我以一种格式保存身份验证令牌和刷新令牌,如果出现问题,我可以轻松地将其替换掉。然后,每次调用API时都会检查我的身份验证。如果我收到授权例外,我会以编程方式刷新我的令牌,您可以做!使用BoxApi.V2 .NET SDK就是这样:

    var authenticator = new TokenProvider(_clientId, _clientSecret);
    // calling the 'RefreshAccessToken' method in the SDK
    var newAuthToken = authenticator.RefreshAccessToken([YOUR EXISTING REFRESH TOKEN]);
    // write the new token back to my data store.
    Save(newAuthToken);
    

    希望这有帮助!

答案 1 :(得分:1)

如果我理解正确,您希望整个过程自动化,因此不需要用户登录(即运行脚本并上传文件)。 嗯,这是可能的。我是新手开发者,如果我没有使用正确的条款,请原谅。

无论如何,这可以通过使用cURL来完成。 首先,您需要定义一些变量,您的用户凭据(用户名和密码),您的客户端ID和Box给出的客户端密码(在您的应用程序中找到),您的重定向URI和状态(如果我理解正确,则用于额外的安全性)。 / p>

oAuth2.0是一个4步验证过程,您需要单独完成每个步骤。

第一步是设置一个curl实例:

curl_setopt_array($curl, array(

   CURLOPT_URL => "https://app.box.com/api/oauth2/authorize",

   CURLOPT_RETURNTRANSFER => true,

   CURLOPT_ENCODING => "content-type: application/x-www-form-urlencoded",

   CURLOPT_MAXREDIRS => 10,

   CURLOPT_TIMEOUT => 30,

   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

   CURLOPT_CUSTOMREQUEST => "POST",

   CURLOPT_POSTFIELDS =>
 "response_type=code&client_id=".$CLIENT_ID."&state=".$STATE,

));

这将返回带有请求令牌的html文本,您将需要它用于下一步,因此我将整个输出保存到变量并使用请求令牌grep标记(标记有"name" = "request_token""value"这是实际的令牌。)

下一步,您需要向同一个网址发送另一个curl请求,这次帖子字段应包含请求令牌,用户名和密码,如下所示:

CURLOPT_POSTFIELDS => "response_type=code&client_id=".$CLIENT_ID."&state=".$STATE."&request_token=".$REQ_TOKEN."&login=".$USER_LOGIN."&password=".$PASSWORD

此时你还应该设置一个cookie文件:

  CURLOPT_COOKIEFILE => $COOKIE, (where $COOKIE is the path to the cookie file)

这将返回另一个html文本输出,使用相同的方法来grep名为“ic”的标记。

对于下一步,您需要向同一个网址发送帖子请求。它应该包括postfields:

response_type=code&client_id=".$CLIENT_ID."&state=".$STATE."&redirect_uri=".$REDIRECT_URI."&doconsent=doconsent&scope=root_readwrite&ic=".$IC

请务必将curl请求设置为使用您之前设置的Cookie文件,如下所示:

CURLOPT_COOKIEFILE => $COOKIE,

并在请求中包含标题:

CURLOPT_HEADER => true,

在步骤(如果由浏览器完成),您将被重定向到如上所述的URL:

http://0.0.0.0(*redirect uri*)/?state=[box-generated_state_security_token]&code=[SOME_CODE] and note the "code=" value.

抓住"code"

的值

最后一步!

向https // app.box.com / api / oauth2 / token发送新的cur请求 这应包括字段:

CURLOPT_POSTFIELDS => "grant_type=authorization_code&code=".$CODE."&client_id=".$CLIENT_ID."&client_secret=".$CLIENT_SECRET,

这将返回包含“访问令牌”,“过期”和“刷新令牌”的字符串。 这些是上传所需的令牌。 在这里阅读有关它们的用法: https://box-content.readme.io/reference#upload-a-file

希望这有点帮助。 P.S, 我在purpuse上分离了https(Stackoverflow不会让我发布一个超过1个网址的答案:D) 这是针对PHP cURL的。使用Bash cURL也可以这样做。

答案 2 :(得分:0)

您是否考虑过为此特定目的创建一个盒子“集成”用户。似乎必须使用Box帐户进行上传。听起来你正试图进行匿名上传。我认为box,像大多数服务一样,包括stackoverflow都不希望匿名上传。

您可以创建系统用户。去做Oauth2舞蹈并将刷新令牌存放在安全的地方。然后,当脚本唤醒的第一步时,请使用刷新令牌并存储新的刷新令牌。然后上传所有文件。