This is an automated email from the ASF dual-hosted git repository. suyanhanx pushed a commit to branch dropbox-batch-delete in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
commit f4747b63f990a01e7eb47c572c461db10dc62e0b Author: suyanhanx <[email protected]> AuthorDate: Fri Jul 7 14:33:16 2023 +0800 refresh token flow Signed-off-by: suyanhanx <[email protected]> --- core/src/services/dropbox/builder.rs | 47 +++++++++++++++++++++++++++--------- core/src/services/dropbox/core.rs | 5 ++-- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/core/src/services/dropbox/builder.rs b/core/src/services/dropbox/builder.rs index 2827d86a9..bbe1470f8 100644 --- a/core/src/services/dropbox/builder.rs +++ b/core/src/services/dropbox/builder.rs @@ -49,10 +49,32 @@ use crate::*; /// /// # Configuration /// -/// - `access_token`: set the access_token for google drive api -/// - `root`: Set the work directory for backend +/// - `root`: Set the work directory for this backend. /// -/// You can refer to [`DropboxBuilder`]'s docs for more information +/// ## Credentials related +/// +/// ### Just provide Access Token (Temporary) +/// +/// - `access_token`: set the access_token for this backend. +/// Please notice its expiration. +/// +/// ### Or provide Client ID and Client Secret and refresh token (Long Term) +/// +/// If you want to let OpenDAL to refresh the access token automatically, +/// please provide the following fields: +/// +/// - `refresh_token`: set the refresh_token for dropbox api +/// - `client_id`: set the client_id for dropbox api +/// - `client_secret`: set the client_secret for dropbox api +/// +/// OpenDAL is a library, it cannot do the first step of OAuth2 for you. +/// You need to get authorization code from user by calling Dropbox's authorize url +/// and exchange it for refresh token. +/// +/// Please refer to [Dropbox OAuth2 Guide](https://www.dropbox.com/developers/reference/oauth-guide) +/// for more information. +/// +/// You can refer to [`DropboxBuilder`]'s docs for more information. /// /// # Example /// @@ -66,8 +88,8 @@ use crate::*; /// /// #[tokio::main] /// async fn main() -> Result<()> { -/// // create backend builder /// let mut builder = Dropbox::default(); +/// builder.root("/test"); /// builder.access_token("<token>"); /// /// let op: Operator = Operator::new(builder)?.finish(); @@ -78,7 +100,9 @@ use crate::*; #[derive(Default)] pub struct DropboxBuilder { root: Option<String>, + access_token: Option<String>, + refresh_token: Option<String>, client_id: Option<String>, client_secret: Option<String>, @@ -105,15 +129,16 @@ impl DropboxBuilder { /// /// You can get the access token from [Dropbox App Console](https://www.dropbox.com/developers/apps) /// - /// NOTE: this token will be expired in 4 hours. If you are trying to use dropbox services in a long time, please set a refresh_token instead. + /// NOTE: this token will be expired in 4 hours. + /// If you are trying to use the Dropbox service in a long time, please set a refresh_token instead. pub fn access_token(&mut self, access_token: &str) -> &mut Self { self.access_token = Some(access_token.to_string()); self } - /// Refersh token is used for long term access to the Dropbox API. + /// Refresh token is used for long term access to the Dropbox API. /// - /// You can get the refresh token via OAuth2.0 Flow of dropbox. + /// You can get the refresh token via OAuth 2.0 Flow of Dropbox. /// /// OpenDAL will use this refresh token to get a new access token when the old one is expired. pub fn refresh_token(&mut self, refresh_token: &str) -> &mut Self { @@ -121,17 +146,17 @@ impl DropboxBuilder { self } - /// Set the client id for dropbox. + /// Set the client id for Dropbox. /// - /// This is required for OAuth2.0 Flow with refresh token. + /// This is required for OAuth 2.0 Flow to refresh the access token. pub fn client_id(&mut self, client_id: &str) -> &mut Self { self.client_id = Some(client_id.to_string()); self } - /// Set the client secret for dropbox. + /// Set the client secret for Dropbox. /// - /// This is required for OAuth2.0 Flow with refresh token. + /// This is required for OAuth 2.0 Flow with refresh the access token. pub fn client_secret(&mut self, client_secret: &str) -> &mut Self { self.client_secret = Some(client_secret.to_string()); self diff --git a/core/src/services/dropbox/core.rs b/core/src/services/dropbox/core.rs index bbb2e5208..07d67ecaa 100644 --- a/core/src/services/dropbox/core.rs +++ b/core/src/services/dropbox/core.rs @@ -175,7 +175,7 @@ impl DropboxCore { if !signer.access_token.is_empty() && signer.expires_in > Utc::now() { let value = format!("Bearer {}", signer.access_token) .parse() - .expect("token must be valid header"); + .expect("token must be valid header value"); req.headers_mut().insert(header::AUTHORIZATION, value); return Ok(()); } @@ -202,7 +202,6 @@ impl DropboxCore { serde_json::from_slice(&body).map_err(new_json_deserialize_error)?; // Update signer after token refreshed. - signer.access_token = token.access_token.clone(); // Refresh it 2 minutes earlier. @@ -211,7 +210,7 @@ impl DropboxCore { let value = format!("Bearer {}", token.access_token) .parse() - .expect("token must be valid header"); + .expect("token must be valid header value"); req.headers_mut().insert(header::AUTHORIZATION, value); Ok(())
