summaryrefslogtreecommitdiff
path: root/chromium/components/signin/core/browser/access_token_fetcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/components/signin/core/browser/access_token_fetcher.h')
-rw-r--r--chromium/components/signin/core/browser/access_token_fetcher.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/chromium/components/signin/core/browser/access_token_fetcher.h b/chromium/components/signin/core/browser/access_token_fetcher.h
new file mode 100644
index 00000000000..2963ab8b797
--- /dev/null
+++ b/chromium/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_