404 when trying to get BoxFolder.Info or BoxFile.Info (JWT authentication)
I'm authenticating with JWT using BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection
I can successfully get events using EventLog.getEnterpriseEvents
But when I try to get Info on a specific file or folder, referenced by ID from an event, I get com.box.sdk.BoxAPIException: The API returned an error code: 404
IDs come from an event like so
JsonObject parent = (JsonObject)event.getSourceJSON().get("parent");
String parentName = parent.get("name").asString();
String parentId = parent.get("id").asString();
BoxFolder parentFolder = new BoxFolder(api, parentId);
BoxFolder.Info info = parentFolder.getInfo();
Any ideas?
-
Sure:
EventLog eventLog = getDownloadEvents();
while (eventLog.getSize() > 0) {
for (BoxEvent event : eventLog) {
String itemId = event.getSourceJSON().get("item_id").asString();
String itemName = event.getSourceJSON().get("item_name").asString();
BoxFile file = new BoxFile(api, itemId);
BoxFile.Info info = file.getInfo();and:
private EventLog getDownloadEvents() {
Date from = new DateTime(new Date()).minusDays(MAX_DAYS).toDate();
Date to = new DateTime(new Date()).plusDays(1).toDate();
return EventLog.getEnterpriseEvents(api, from, to, BoxEvent.Type.DOWNLOAD);
}Using api I get like so:
api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(
config.getBoxEnterpriseId(), config.getClientId(), config.getClientSecret(), jwtEncryptionPreferences, accessTokenCache);Thanks for the help!
EditI surrounded the lines where I get the info an an if statement to make sure the item is actually a BoxFile and not a BoxFolder, and still get the 404:
{"type":"error","status":404,"code":"not_found","context_info":{"errors":[{"reason":"invalid_parameter","name":"item","message":"Invalid value 'f_44403940033'. 'item' with value 'f_44403940033' not found"}]},"help_url":"http:\/\/developers.box.com\/docs\/#errors","message":"Not Found","request_id":"removed for privacy7583c5d83d6e43"}
-
I've gotten a 404 when the user has not accepted terms of acceptance but there wasn't a way for me to find the true error using the box-java-sdk. I had to get the file id where the error occurred and run it in postman.
curl https://api.box.com/2.0/files/FILE_ID -H "Authorization: Bearer ACCESS_TOKEN"
-
It comes back 404 for all files. Many of these users have definitely accepted Ts&Cs as they're day-to-day users.
You don't see any issue with me using the "enterprise" connection rather than this user-based connection? I'm not creating an app user - just using the enterprise connection.
-
I think you're on to something.
The enterprise events expects an admin user to run it. So I tested with a non-JWT api and it worked just fine.
But when I use JWT and print out the current user, I get some odd user.
BoxDeveloperEditionAPIConnection api = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(
ENTERPRISE_ID, CLIENT_ID, CLIENT_SECRET, encryptionPref, accessTokenCache);
Date beginDate = new Date(System.currentTimeMillis() - (1000 * 60 * 60 * 2));
Date endDate = new Date(System.currentTimeMillis());
BoxUser user = BoxUser.getCurrentUser(api);
System.out.println("Name: " + user.getInfo().getName());
System.out.println("Login: " + user.getInfo().getLogin());
EventLog eventLog = EventLog.getEnterpriseEvents(api, beginDate, endDate, BoxEvent.Type.DOWNLOAD);Output:
Name: KenJWT
Login: ***@example.com
com.box.sdk.BoxAPIException: The API returned an error code: 403 -
I am also getting this problem.
Trying to get the information on a file upload from an event in the EnterpriseEvents
GET /2.0/files/20***phone number removed for privacy***HTTP/1.1
Host: api.box.com
Authorization: Bearer xxx(AdminAccount)Response
{ "type": "error", "status": 404, "code": "not_found", "context_info": { "errors": [ { "reason": "invalid_parameter", "name": "item", "message": "Invalid value 'f_20***phone number removed for privacy***'. 'item' with value 'f_20***phone number removed for privacy***' not found" } ] }, "help_url": "http://developers.box.com/docs/#errors", "message": "Not Found", "request_id": "***number removed for privacy***6598a9c32461ce" }
It must be a bug I think.
-
i was also having the same issue. after lots of efforts i have finally got the result.
while authenticating using JWT you should generate token for an user not an Application.
Please see below code which is returning me my folder details.
using System; using System.ComponentModel; using System.IO; using System.Threading.Tasks; using Box.V2.Config; using Box.V2.JWTAuth; using Box.V2.Models; namespace BoxExample { class Program { static void Main(string[] args) { string path = Environment.CurrentDirectory+ "\\Files\\47637819_mlfpfwfj_config.json"; IBoxConfig config = null; using (FileStream fs = new FileStream(path, FileMode.Open)) { config = BoxConfig.CreateFromJsonFile(fs); } try { methodAsync(config).Wait(); } catch (Exception ex) { Console.WriteLine(ex.Message); /* The exception will be caught because you've waited for the completion of the call. */ } } static async Task methodAsync(IBoxConfig config) { BoxFolder folder = null; try { // Create JWT auth using config file var userId = "user id"; var session = new BoxJWTAuth(config); var userToken = session.UserToken(userId); //var adminToken = boxJWT.AdminToken(); var client = session.AdminClient(userToken); folder = await client.FoldersManager.GetInformationAsync("folder id"); } catch(Exception ex) { Console.WriteLine(ex.Message); } return folder; } } }
-
I got same error even when trying through a user connection like this (scala using java sdk)
val MAX_CACHE_ENTRIES = 100 val accessTokenCache: IAccessTokenCache = new InMemoryLRUAccessTokenCache(MAX_CACHE_ENTRIES) val boxConfig = new InputStreamReader( new FileInputStream( path ) ) val conn = BoxDeveloperEditionAPIConnection.getAppEnterpriseConnection(boxConfig, accessTokenCache) val params = new CreateUserParams params.setSpaceAmount(1048576) // 1 MB val user = BoxUser.createAppUser(connection, APP_USER_NAME, params) var api = client.getUserConnection(user.getID) val file: BoxFile = new BoxFile(api, FILE_ID) val output = new ByteOutputStream() file.download(output)
Here is error:
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.box.sdk.BoxAPIResponseException: The API returned an error code [404 | dvelsag7qd1cv6al.04a0f50840a05a124d47cf37b065dcd94] not_found - Could not find the specified resource
at com.box.sdk.BoxAPIResponse.(BoxAPIResponse.java:92)
at com.box.sdk.BoxJSONResponse.(BoxJSONResponse.java:32)
at com.box.sdk.BoxAPIRequest.trySend(BoxAPIRequest.java:582)
at com.box.sdk.BoxAPIRequest.send(BoxAPIRequest.java:354)
at com.box.sdk.BoxAPIRequest.send(BoxAPIRequest.java:329)
at com.box.sdk.BoxFile.download(BoxFile.java:297)
at com.box.sdk.BoxFile.download(BoxFile.java:285)
at dz.lab.box.ReadFileAsUser$.main(ReadFileAsUser.scala:30)
at dz.lab.box.ReadFileAsUser.main(ReadFileAsUser.scala) -
I managed to read the file using the shared link as follows (it may be helpful in your case):
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))
-
I'm also facing the issue while downloading the file from Box folder:
Am I doing anything wrong here? Can anyone point me in the right direction?
from boxsdk import JWTAuth
from boxsdk import Client
box_config = { "boxAppSettings": { "clientID": "xxxxx", "clientSecret": "xxxxx", "appAuth": { "publicKeyID": "xxxxx", "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----XXXXX-----END ENCRYPTED PRIVATE KEY-----\n", "passphrase": "xxxxx" } }, "enterpriseID": "xxxxx", "webhooks": { "primaryKey": "xxxxx", "secondaryKey": "xxxxx" } }
auth = JWTAuth.from_settings_dictionary(box_config)
client = Client(auth)
user = client.user().get()
me = client.user("xxxxx").get()
try:
file_id = 'xxxxx'
file_content = client.as_user(user).file(file_id).content()
except Exception as e:
print("USER Failed")
print(e)
-
Hi folks, When you created JWT app - it means you making api calls from complete different user! (at least it was not clear for me). And this api service user (AutomationUser_921....[at]boxdevedition.com) has different folder visibility level. Go to this page https://app.box.com/master/content You will find one admin and one app user there. Here you can login as app user and look through the folders your api has access to.
Please sign in to leave a comment.
Comments
21 comments