• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef GOOGLE_APIS_GAIA_UBERTOKEN_FETCHER_H_
6 #define GOOGLE_APIS_GAIA_UBERTOKEN_FETCHER_H_
7 
8 #include "base/memory/scoped_ptr.h"
9 #include "base/timer/timer.h"
10 #include "google_apis/gaia/gaia_auth_consumer.h"
11 #include "google_apis/gaia/oauth2_token_service.h"
12 
13 // Allow to retrieves an uber-auth token for the user. This class uses the
14 // |OAuth2TokenService| and considers that the user is already logged in. It
15 // will use the OAuth2 access token to generate the uber-auth token.
16 //
17 // This class should be used on a single thread, but it can be whichever thread
18 // that you like.
19 //
20 // This class can handle one request at a time.
21 
22 class GaiaAuthFetcher;
23 class GoogleServiceAuthError;
24 
25 namespace net {
26 class URLRequestContextGetter;
27 }
28 
29 // Callback for the |UbertokenFetcher| class.
30 class UbertokenConsumer {
31  public:
UbertokenConsumer()32   UbertokenConsumer() {}
~UbertokenConsumer()33   virtual ~UbertokenConsumer() {}
OnUbertokenSuccess(const std::string & token)34   virtual void OnUbertokenSuccess(const std::string& token) {}
OnUbertokenFailure(const GoogleServiceAuthError & error)35   virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) {}
36 };
37 
38 // Allows to retrieve an uber-auth token.
39 class UbertokenFetcher : public GaiaAuthConsumer,
40                          public OAuth2TokenService::Consumer {
41  public:
42   // Maximum number of retries to get the uber-auth token before giving up.
43   static const int kMaxRetries;
44 
45   UbertokenFetcher(OAuth2TokenService* token_service,
46                    UbertokenConsumer* consumer,
47                    net::URLRequestContextGetter* request_context);
48   virtual ~UbertokenFetcher();
49 
50   // Start fetching the token for |account_id|.
51   virtual void StartFetchingToken(const std::string& account_id);
52 
53   // Overriden from GaiaAuthConsumer
54   virtual void OnUberAuthTokenSuccess(const std::string& token) OVERRIDE;
55   virtual void OnUberAuthTokenFailure(
56       const GoogleServiceAuthError& error) OVERRIDE;
57 
58   // Overriden from OAuth2TokenService::Consumer:
59   virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request,
60                                  const std::string& access_token,
61                                  const base::Time& expiration_time) OVERRIDE;
62   virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request,
63                                  const GoogleServiceAuthError& error) OVERRIDE;
64 
65  private:
66   // Request a login-scoped access token from the token service.
67   void RequestAccessToken();
68 
69   // Exchanges an oauth2 access token for an uber-auth token.
70   void ExchangeTokens();
71 
72   OAuth2TokenService* token_service_;
73   UbertokenConsumer* consumer_;
74   net::URLRequestContextGetter* request_context_;
75   scoped_ptr<GaiaAuthFetcher> gaia_auth_fetcher_;
76   scoped_ptr<OAuth2TokenService::Request> access_token_request_;
77   std::string account_id_;
78   std::string access_token_;
79   int retry_number_;
80   base::OneShotTimer<UbertokenFetcher> retry_timer_;
81   bool second_access_token_request_;
82 
83   DISALLOW_COPY_AND_ASSIGN(UbertokenFetcher);
84 };
85 
86 #endif  // GOOGLE_APIS_GAIA_UBERTOKEN_FETCHER_H_
87