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

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

查看过这个了吗? - admdrew
很不幸,我仍然需要经过用户(我们)的身份验证过程,OAuth2.0过程涉及用户(我们)输入凭据以完成该过程。 - user1110938
4个回答

10

我刚才经历了完全相同的问题,并发现目前您无法绕过OAuth过程。但是,他们的刷新令牌现在有效期为60天,这应该使任何自定义设置更加稳定。尽管如此,我仍然认为,在企业设置中使用OAuth是一种非常脆弱的实现方式——因为正如你所说的那样:对于一些中间件应用程序来说,不可能依赖于OAuth身份验证过程。

我的解决方案:

以下是与各种Box API文档和视频中概述的相同步骤:

  1. 使用此URL 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/找到原始URL)
  2. 将该URL粘贴到浏览器中并转到该网址
  3. 进行身份验证并授权
  4. 获取结果URL:http://0.0.0.0/?state=[box-generated_state_security_token]&code=[SOME_CODE]并注意"code="的值。
  5. 打开POSTMAN或Fiddler(或其他一些HTTP嗅探器)并输入以下内容:
    • URL: https://www.box.com/api/oauth2/token
    • 创建URL编码的post数据:
      • grant_type=authorization_code
      • client_id=[YOUR CLIENT ID]
      • client_secret=[YOUR 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"
    }
    

在我的应用程序中,我以易于替换的格式保存身份验证令牌和刷新令牌,以防将来出现问题。然后,每次调用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
对于最近想要实现这个功能的人,最好的方法是在Box中创建一个有限访问应用程序
这将允许您创建访问令牌,以便进行服务器之间的通信。然后很容易上传文件(例如在NodeJS中):
import box from "box-node-sdk";
import fs from "fs";

(async function (){
  const client = box.getBasicClient(YOUR_ACCESS_TOKEN);
  await client.files.uploadFile(BOX_FOLDER_ID, FILE_NAME, fs.createReadStream(LOCAL_FILE_PATH));
})();

现在这是正确的答案。唯一的注意事项是您必须与应用服务帐户共享需要写入的文件夹。服务帐户电子邮件可以在应用程序详细信息页面上找到。 - Vova Rozhkov

1
如果我理解正确,您希望整个过程都是自动化的,因此不需要用户登录(即运行脚本并上传文件)。 嗯,这是可能的。我是一名新手开发人员,如果我没有使用正确的术语,请原谅。
无论如何,可以通过使用cURL来实现这一点。 首先,您需要定义一些变量,例如您的用户凭据(用户名和密码),由Box提供的客户端ID和客户端密钥(在您的应用程序中找到),以及您的重定向URI和状态(如果我理解正确,则用于额外的安全性)。
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文本,您需要它作为下一步操作所需,因此我会将整个输出保存到变量中并使用请求令牌(标签具有"name"="request_token""value"是实际令牌)进行筛选。

下一步,您需要向相同的url发送另一个curl请求,这次post字段应包括请求令牌、用户名和密码,如下所示:

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文本输出,使用相同的方法来获取名称为"ic"的令牌。 接下来,您需要向同一URL发送POST请求。它应该包括以下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 希望这对您有所帮助。 附注: 我故意分开了 https(Stackoverflow 不允许我发布超过 1 个 URL 的答案:D) 这是针对 PHP cURL 的。也可以使用 Bash cURL 进行相同操作。

0

你有没有考虑为这个特定目的创建一个“集成”用户。似乎必须使用Box帐户上传文件。听起来你想进行匿名上传。我认为像大多数服务一样,包括stackoverflow,Box也不希望进行匿名上传。

你可以创建一个系统用户。进行Oauth2验证并将刷新令牌存储在安全的地方。然后,在脚本唤醒的第一步中,使用刷新令牌并存储新的刷新令牌。然后上传所有文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接