Файл Java SDK Box 404 не найден в общедоступном документе - PullRequest
0 голосов
/ 06 октября 2019

Я использую 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()

Затем с этим токеном доступа и идентификатором файла я отправляю 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"
}

Я неправильно использую токен доступа?

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Судя по всему, вы используете приложение на основе JWT / OAuth 2 для Box, поэтому, когда вы получаете свой токен доступа (BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection), этот токен доступа ссылается на вашу учетную запись службы.

служебная учетная запись - это программная учетная запись Box, которая представляет ваше приложение - для всех целей и задач это просто еще одна учетная запись пользователя без учетных данных для входа в систему для box.com.

Я предполагаю, почему вы получаете 404, чтоID файла, на который вы ссылаетесь, предназначен для файла, который хранится в какой-то другой учетной записи пользователя (вполне возможно, в вашей учетной записи box.com). Поскольку маркер доступа ограничен для учетной записи службы, он пытается найти идентификатор файла в этой учетной записи службы, а не в другой учетной записи. По умолчанию служебная учетная запись не может просто получить доступ ко всем файлам / папкам, принадлежащим другим людям в вашей компании / предприятии, она может получить доступ только к своим собственным данным, если они не работают совместно с файлом / папкой.

Чтобы получить доступ к этому файлу, вам нужно сделать запрос как пользователь, которому принадлежит файл. Вот руководство о том, как сгенерировать токен доступа, предназначенный для пользователя, который должен решить проблему.

Надеюсь, это поможет, Джон

0 голосов
/ 11 октября 2019

Мне удалось прочитать файл по общей ссылке следующим образом:

    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))
...