oracle-cloud-infrastructureoci-java-sdkoracle-cloud-infrastructure-classic

Getting the URL for a bucket or an object using oci-java-sdk


I have already a code to retrieve the objects in the bucket using oci-java-sdk and this is working as expected. I would like to retrieve the URL of the file which was uploaded to the bucket in object storage and when I use this URL, this should redirect to the actual location without asking any credentials. I saw preauthenticated requests but again i need to create one more request. I dont want to send one more request and want to get URL in the existing GetObjectResponse. Any suggestions> Thanks, js


Solution

  • The URL of an object is not returned from the API but can be built using information you know (See Update Below!). The pattern is:

    https://{api_endpoint}/n/{namespace_name}/b/{bucket_name}/o/{object_name}

    Accessing that URL will (generally, see below) require authentication. Our authentication mechanism is described at:

    https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/signingrequests.htm

    Authentication is NOT required if you configure the bucket as a Public Bucket.

    https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/managingbuckets.htm?TocPath=Services%7CObject%20Storage%7C_____2#publicbuckets

    As you mentioned, Pre-authenticated Requests (PARs) are an option. They are generally used in this situation, and they work well.

    https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/usingpreauthenticatedrequests.htm

    Strictly speaking, it is also possible to use our Amazon S3 Compatible API...

    https://docs.cloud.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm

    ...and S3's presigned URLs to generate (without involving the API) a URL that will work without additional authentication.

    https://docs.aws.amazon.com/AmazonS3/latest/dev/ShareObjectPreSignedURL.html

    Update: A teammate pointed out that the OCI SDK for Java now includes a getEndpoint method that can be used to get the hostname needed when querying the Object Storage API. https://docs.cloud.oracle.com/en-us/iaas/tools/java/1.25.3/com/oracle/bmc/objectstorage/ObjectStorage.html#getEndpoint--