Index: components/signin/core/browser/access_token_fetcher.h |
diff --git a/components/signin/core/browser/access_token_fetcher.h b/components/signin/core/browser/access_token_fetcher.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2963ab8b797d0f9ee592b0ae5e70a561174da2e5 |
--- /dev/null |
+++ b/components/signin/core/browser/access_token_fetcher.h |
@@ -0,0 +1,85 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_SIGNIN_CORE_BROWSER_ACCESS_TOKEN_FETCHER_H_ |
+#define COMPONENTS_SIGNIN_CORE_BROWSER_ACCESS_TOKEN_FETCHER_H_ |
+ |
+#include <memory> |
+#include <string> |
+ |
+#include "base/callback.h" |
+#include "base/macros.h" |
+#include "components/signin/core/browser/signin_manager_base.h" |
+#include "google_apis/gaia/google_service_auth_error.h" |
+#include "google_apis/gaia/oauth2_token_service.h" |
+ |
+// Helper class to ease the task of obtaining an OAuth2 access token for the |
+// authenticated account. This handles various special cases, e.g. when the |
+// refresh token isn't loaded yet (during startup), or when there is some |
+// transient error. |
+// May only be used on the UI thread. |
+class AccessTokenFetcher : public SigninManagerBase::Observer, |
+ public OAuth2TokenService::Observer, |
+ public OAuth2TokenService::Consumer { |
+ public: |
+ // Callback for when a request completes (successful or not). On successful |
+ // requests, |error| is NONE and |access_token| contains the obtained OAuth2 |
+ // access token. On failed requests, |error| contains the actual error and |
+ // |access_token| is empty. |
+ using TokenCallback = |
+ base::OnceCallback<void(const GoogleServiceAuthError& error, |
+ const std::string& access_token)>; |
+ |
+ // Instantiates a fetcher and immediately starts the process of obtaining an |
+ // OAuth2 access token for the given |scopes|. The |callback| is called once |
+ // the request completes (successful or not). If the AccessTokenFetcher is |
+ // destroyed before the process completes, the callback is not called. |
+ AccessTokenFetcher(const std::string& oauth_consumer_name, |
+ SigninManagerBase* signin_manager, |
+ OAuth2TokenService* token_service, |
+ const OAuth2TokenService::ScopeSet& scopes, |
+ TokenCallback callback); |
+ |
+ ~AccessTokenFetcher() override; |
+ |
+ private: |
+ void Start(); |
+ |
+ void WaitForRefreshToken(); |
+ void StartAccessTokenRequest(); |
+ |
+ // SigninManagerBase::Observer implementation. |
+ void GoogleSigninSucceeded(const std::string& account_id, |
+ const std::string& username, |
+ const std::string& password) override; |
+ void GoogleSigninFailed(const GoogleServiceAuthError& error) override; |
+ |
+ // OAuth2TokenService::Observer implementation. |
+ void OnRefreshTokenAvailable(const std::string& account_id) override; |
+ void OnRefreshTokensLoaded() override; |
+ |
+ // OAuth2TokenService::Consumer implementation. |
+ void OnGetTokenSuccess(const OAuth2TokenService::Request* request, |
+ const std::string& access_token, |
+ const base::Time& expiration_time) override; |
+ void OnGetTokenFailure(const OAuth2TokenService::Request* request, |
+ const GoogleServiceAuthError& error) override; |
+ |
+ SigninManagerBase* signin_manager_; |
+ OAuth2TokenService* token_service_; |
+ OAuth2TokenService::ScopeSet scopes_; |
+ TokenCallback callback_; |
+ |
+ bool waiting_for_sign_in_; |
+ bool waiting_for_refresh_token_; |
+ |
+ std::unique_ptr<OAuth2TokenService::Request> access_token_request_; |
+ |
+ // When a token request gets canceled, we want to retry once. |
+ bool access_token_retried_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AccessTokenFetcher); |
+}; |
+ |
+#endif // COMPONENTS_SIGNIN_CORE_BROWSER_ACCESS_TOKEN_FETCHER_H_ |