Box Java SDK - 404 在公开可用的文档上找不到文件
Box Java SDK - 404 File Not Found on publicly available document
我正在使用 Box SDK 获取这样的访问令牌:
val MAX_CACHE_ENTRIES = 100
val accessTokenCache: IAccessTokenCache = new InMemoryLRUAccessTokenCache(MAX_CACHE_ENTRIES)
val boxConfig: BoxConfig = {
// Read Box config file
val stream = getClass.getResourceAsStream( path )
val reader = new InputStreamReader( stream )
BoxConfig.readFrom( reader )
}
val connection: BoxDeveloperEditionAPIConnection = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache)
val accessToken = connection.getAccessToken()
然后使用此访问令牌和我发送的文件 ID POST 读取文件如下:
val fileId = "FILE ID"
val url = s"https://api.box.com/2.0/files/$fileId/content"
val header = List(Header("Authorization", s"Bearer $token"))
// send request
当我发送带有此自动生成令牌的 POST 请求时,我收到了 404 未找到文件错误,但是如果我从 Box Developer Console 手动生成令牌,则相同的代码可以工作并且我可以检索文件内容。
响应看起来像这样
{
"access_token":"TOKEN",
"expires_in":4195,
"restricted_to":[],
"token_type":"bearer"
}
我使用的访问令牌有误吗?
看起来您在 Box 上使用基于 JWT/OAuth 2 的应用程序,因此当您获得访问令牌 (BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection) 时,该访问令牌正在引用您的服务帐户。
服务帐户是代表您的应用程序的程序化 Box 帐户 - 就所有意图和目的而言,它只是另一个没有 box.com.
登录凭据的用户帐户
我猜测您收到 404 的原因是您引用的文件 ID 是存储在其他用户帐户(很可能是您自己的 box.com 帐户)中的文件。由于访问令牌的范围适用于服务帐户,因此它试图在该服务帐户中而不是在您的其他帐户中查找文件 ID。默认情况下,服务帐户不能只访问您公司/企业中其他人拥有的所有文件/文件夹,它只能访问自己的数据,除非它在文件/文件夹上进行协作。
要访问该文件,您需要以拥有该文件的用户身份提出请求。 Here's a guide 关于如何生成用户范围内的访问令牌,这应该可以解决问题。
希望对您有所帮助,
乔恩
我设法使用共享 link 读取文件如下:
val enterpriseApi = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache)
// Read File Metadata
val sharedLink = "......"
val info = BoxItem.getSharedItem(enterpriseApi, sharedLink)
println(s"File ID: ${info.getID}, Owener ID: ${info.getOwnedBy().getID} and name ${info.getOwnedBy().getName}")
// Create a connection as the File owner
val api = BoxDeveloperEditionAPIConnection.getAppUserConnection(info.getOwnedBy().getID, boxConfig)
println(s"enterprise token ${client.connection.getAccessToken}, user token is ${api.getAccessToken}")
// Read file as user
val file: BoxFile = new BoxFile(api, info.getID)
val output = new ByteOutputStream()
file.download(output)
println(new String(output.getBytes))
我正在使用 Box SDK 获取这样的访问令牌:
val MAX_CACHE_ENTRIES = 100
val accessTokenCache: IAccessTokenCache = new InMemoryLRUAccessTokenCache(MAX_CACHE_ENTRIES)
val boxConfig: BoxConfig = {
// Read Box config file
val stream = getClass.getResourceAsStream( path )
val reader = new InputStreamReader( stream )
BoxConfig.readFrom( reader )
}
val connection: BoxDeveloperEditionAPIConnection = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache)
val accessToken = connection.getAccessToken()
然后使用此访问令牌和我发送的文件 ID POST 读取文件如下:
val fileId = "FILE ID"
val url = s"https://api.box.com/2.0/files/$fileId/content"
val header = List(Header("Authorization", s"Bearer $token"))
// send request
当我发送带有此自动生成令牌的 POST 请求时,我收到了 404 未找到文件错误,但是如果我从 Box Developer Console 手动生成令牌,则相同的代码可以工作并且我可以检索文件内容。
响应看起来像这样
{
"access_token":"TOKEN",
"expires_in":4195,
"restricted_to":[],
"token_type":"bearer"
}
我使用的访问令牌有误吗?
看起来您在 Box 上使用基于 JWT/OAuth 2 的应用程序,因此当您获得访问令牌 (BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection) 时,该访问令牌正在引用您的服务帐户。
服务帐户是代表您的应用程序的程序化 Box 帐户 - 就所有意图和目的而言,它只是另一个没有 box.com.
登录凭据的用户帐户我猜测您收到 404 的原因是您引用的文件 ID 是存储在其他用户帐户(很可能是您自己的 box.com 帐户)中的文件。由于访问令牌的范围适用于服务帐户,因此它试图在该服务帐户中而不是在您的其他帐户中查找文件 ID。默认情况下,服务帐户不能只访问您公司/企业中其他人拥有的所有文件/文件夹,它只能访问自己的数据,除非它在文件/文件夹上进行协作。
要访问该文件,您需要以拥有该文件的用户身份提出请求。 Here's a guide 关于如何生成用户范围内的访问令牌,这应该可以解决问题。
希望对您有所帮助, 乔恩
我设法使用共享 link 读取文件如下:
val enterpriseApi = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache)
// Read File Metadata
val sharedLink = "......"
val info = BoxItem.getSharedItem(enterpriseApi, sharedLink)
println(s"File ID: ${info.getID}, Owener ID: ${info.getOwnedBy().getID} and name ${info.getOwnedBy().getName}")
// Create a connection as the File owner
val api = BoxDeveloperEditionAPIConnection.getAppUserConnection(info.getOwnedBy().getID, boxConfig)
println(s"enterprise token ${client.connection.getAccessToken}, user token is ${api.getAccessToken}")
// Read file as user
val file: BoxFile = new BoxFile(api, info.getID)
val output = new ByteOutputStream()
file.download(output)
println(new String(output.getBytes))