// Copyright (c) 2012 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 CHROME_BROWSER_GOOGLE_APIS_AUTH_SERVICE_H_ #define CHROME_BROWSER_GOOGLE_APIS_AUTH_SERVICE_H_ #include #include #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "chrome/browser/google_apis/gdata_errorcode.h" #include "chrome/browser/google_apis/operations_base.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" class Profile; namespace gdata { class OperationRegistry; // This class provides authentication for Google services. // It integrates specific service integration with OAuth2 stack // (TokenService) and provides OAuth2 token refresh infrastructure. // All public functions must be called on UI thread. class AuthService : public content::NotificationObserver { public: class Observer { public: // Triggered when a new OAuth2 refresh token is received from TokenService. virtual void OnOAuth2RefreshTokenChanged() = 0; protected: virtual ~Observer() {} }; explicit AuthService(const std::vector& scopes); virtual ~AuthService(); // Adds and removes the observer. AddObserver() should be called before // Initialize() as it can change the refresh token. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); // Initializes the auth service. Starts TokenService to retrieve the // refresh token. void Initialize(Profile* profile); // Starts fetching OAuth2 auth token from the refresh token for |scopes_|. void StartAuthentication(OperationRegistry* registry, const AuthStatusCallback& callback); // True if an OAuth2 access token is retrieved and believed to be fresh. // The access token is used to access the Drive server. bool HasAccessToken() const { return !access_token_.empty(); } // True if an OAuth2 refresh token is present. Its absence means that user // is not properly authenticated. // The refresh token is used to get the access token. bool HasRefreshToken() const { return !refresh_token_.empty(); } // Returns OAuth2 access token. const std::string& access_token() const { return access_token_; } // Clears OAuth2 access token. void ClearAccessToken() { access_token_.clear(); } // Overridden from content::NotificationObserver: virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; // Sets the access_token as specified. This should be used only for testing. void set_access_token_for_testing(const std::string& token) { access_token_ = token; } private: // Helper function for StartAuthentication() call. void StartAuthenticationOnUIThread(OperationRegistry* registry, const AuthStatusCallback& callback); // Callback for AuthOperation (InternalAuthStatusCallback). void OnAuthCompleted(const AuthStatusCallback& callback, GDataErrorCode error, const std::string& access_token); Profile* profile_; std::string refresh_token_; std::string access_token_; std::vector scopes_; ObserverList observers_; content::NotificationRegistrar registrar_; // Note: This should remain the last member so it'll be destroyed and // invalidate its weak pointers before any other members are destroyed. base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(AuthService); }; } // namespace gdata #endif // CHROME_BROWSER_GOOGLE_APIS_AUTH_SERVICE_H_