@@ -7,13 +7,16 @@ use futures_util::stream::BoxStream;
77use objectstore_types:: { Compression , ExpirationPolicy , scope} ;
88use url:: Url ;
99
10+ use crate :: auth:: TokenGenerator ;
11+
1012const USER_AGENT : & str = concat ! ( "objectstore-client/" , env!( "CARGO_PKG_VERSION" ) ) ;
1113
1214#[ derive( Debug ) ]
1315struct ClientBuilderInner {
1416 service_url : Url ,
1517 propagate_traces : bool ,
1618 reqwest_builder : reqwest:: ClientBuilder ,
19+ token_generator : Option < TokenGenerator > ,
1720}
1821
1922impl ClientBuilderInner {
@@ -66,6 +69,7 @@ impl ClientBuilder {
6669 service_url,
6770 propagate_traces : false ,
6871 reqwest_builder,
72+ token_generator : None ,
6973 } ) )
7074 }
7175
@@ -105,6 +109,14 @@ impl ClientBuilder {
105109 Self ( Ok ( inner) )
106110 }
107111
112+ /// Sets a [`TokenGenerator`] that will be used to sign authorization tokens before
113+ /// sending requests to Objectstore.
114+ pub fn token_generator ( self , token_generator : TokenGenerator ) -> Self {
115+ let Ok ( mut inner) = self . 0 else { return self } ;
116+ inner. token_generator = Some ( token_generator) ;
117+ Self ( Ok ( inner) )
118+ }
119+
108120 /// Returns a [`Client`] that uses this [`ClientBuilder`] configuration.
109121 ///
110122 /// # Errors
@@ -121,6 +133,7 @@ impl ClientBuilder {
121133 reqwest : inner. reqwest_builder . build ( ) ?,
122134 service_url : inner. service_url ,
123135 propagate_traces : inner. propagate_traces ,
136+ token_generator : inner. token_generator ,
124137 } ) ,
125138 } )
126139 }
@@ -224,6 +237,11 @@ impl ScopeInner {
224237 pub ( crate ) fn usecase ( & self ) -> & Usecase {
225238 & self . usecase
226239 }
240+
241+ #[ inline]
242+ pub ( crate ) fn scopes ( & self ) -> & scope:: Scopes {
243+ & self . scopes
244+ }
227245}
228246
229247/// A [`Scope`] is a sequence of key-value pairs that defines a (possibly nested) namespace within a
@@ -281,23 +299,36 @@ pub(crate) struct ClientInner {
281299 reqwest : reqwest:: Client ,
282300 service_url : Url ,
283301 propagate_traces : bool ,
302+ token_generator : Option < TokenGenerator > ,
284303}
285304
286305/// A client for Objectstore. Use [`Client::builder`] to configure and construct a Client.
287306///
288307/// To perform CRUD operations, one has to create a Client, and then scope it to a [`Usecase`]
289308/// and Scope in order to create a [`Session`].
290309///
310+ /// If your Objectstore instance enforces authorization checks, you must provide a
311+ /// [`TokenGenerator`] on creation.
312+ ///
291313/// # Example
292314///
293315/// ```no_run
294316/// use std::time::Duration;
295- /// use objectstore_client::{Client, Usecase};
317+ /// use objectstore_client::{Client, SecretKey, TokenGenerator, Usecase};
318+ /// use objectstore_types::Permission;
296319///
297320/// # async fn example() -> objectstore_client::Result<()> {
321+ /// let token_generator = TokenGenerator::new(SecretKey {
322+ /// secret_key: "<safely inject secret key>".into(),
323+ /// kid: "my-service".into(),
324+ /// })?
325+ /// .expiry_seconds(30)
326+ /// .permissions(&[Permission::ObjectRead]);
327+ ///
298328/// let client = Client::builder("http://localhost:8888/")
299329/// .timeout(Duration::from_secs(1))
300330/// .propagate_traces(true)
331+ /// .token_generator(token_generator)
301332/// .build()?;
302333///
303334/// let session = Usecase::new("my_app")
@@ -384,11 +415,16 @@ impl Session {
384415 & self ,
385416 method : reqwest:: Method ,
386417 object_key : & str ,
387- ) -> reqwest:: RequestBuilder {
418+ ) -> crate :: Result < reqwest:: RequestBuilder > {
388419 let url = self . object_url ( object_key) ;
389420
390421 let mut builder = self . client . reqwest . request ( method, url) ;
391422
423+ if let Some ( token_generator) = & self . client . token_generator {
424+ let token = token_generator. sign_for_scope ( & self . scope ) ?;
425+ builder = builder. bearer_auth ( token) ;
426+ }
427+
392428 if self . client . propagate_traces {
393429 let trace_headers =
394430 sentry_core:: configure_scope ( |scope| Some ( scope. iter_trace_propagation_headers ( ) ) ) ;
@@ -397,7 +433,7 @@ impl Session {
397433 }
398434 }
399435
400- builder
436+ Ok ( builder)
401437 }
402438}
403439
0 commit comments