Home | History | Annotate | Download | only in gaia
      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_OAUTH2_ACCESS_TOKEN_FETCHER_IMPL_H_
      6 #define GOOGLE_APIS_GAIA_OAUTH2_ACCESS_TOKEN_FETCHER_IMPL_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/gtest_prod_util.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "google_apis/gaia/oauth2_access_token_consumer.h"
     14 #include "google_apis/gaia/oauth2_access_token_fetcher.h"
     15 #include "net/url_request/url_fetcher_delegate.h"
     16 #include "url/gurl.h"
     17 
     18 class OAuth2AccessTokenFetcherImplTest;
     19 
     20 namespace base {
     21 class Time;
     22 }
     23 
     24 namespace net {
     25 class URLFetcher;
     26 class URLRequestContextGetter;
     27 class URLRequestStatus;
     28 }
     29 
     30 // Abstracts the details to get OAuth2 access token token from
     31 // OAuth2 refresh token.
     32 // See "Using the Refresh Token" section in:
     33 // http://code.google.com/apis/accounts/docs/OAuth2WebServer.html
     34 //
     35 // This class should be used on a single thread, but it can be whichever thread
     36 // that you like.
     37 // Also, do not reuse the same instance. Once Start() is called, the instance
     38 // should not be reused.
     39 //
     40 // Usage:
     41 // * Create an instance with a consumer.
     42 // * Call Start()
     43 // * The consumer passed in the constructor will be called on the same
     44 //   thread Start was called with the results.
     45 //
     46 // This class can handle one request at a time. To parallelize requests,
     47 // create multiple instances.
     48 class OAuth2AccessTokenFetcherImpl : public OAuth2AccessTokenFetcher,
     49                                      public net::URLFetcherDelegate {
     50  public:
     51   OAuth2AccessTokenFetcherImpl(OAuth2AccessTokenConsumer* consumer,
     52                                net::URLRequestContextGetter* getter,
     53                                const std::string& refresh_token);
     54   virtual ~OAuth2AccessTokenFetcherImpl();
     55 
     56   // Implementation of OAuth2AccessTokenFetcher
     57   virtual void Start(const std::string& client_id,
     58                      const std::string& client_secret,
     59                      const std::vector<std::string>& scopes) OVERRIDE;
     60 
     61   virtual void CancelRequest() OVERRIDE;
     62 
     63   // Implementation of net::URLFetcherDelegate
     64   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
     65 
     66  private:
     67   enum State {
     68     INITIAL,
     69     GET_ACCESS_TOKEN_STARTED,
     70     GET_ACCESS_TOKEN_DONE,
     71     ERROR_STATE,
     72   };
     73 
     74   // Helper methods for the flow.
     75   void StartGetAccessToken();
     76   void EndGetAccessToken(const net::URLFetcher* source);
     77 
     78   // Helper mehtods for reporting back results.
     79   void OnGetTokenSuccess(const std::string& access_token,
     80                          const base::Time& expiration_time);
     81   void OnGetTokenFailure(const GoogleServiceAuthError& error);
     82 
     83   // Other helpers.
     84   static GURL MakeGetAccessTokenUrl();
     85   static std::string MakeGetAccessTokenBody(
     86       const std::string& client_id,
     87       const std::string& client_secret,
     88       const std::string& refresh_token,
     89       const std::vector<std::string>& scopes);
     90 
     91   static bool ParseGetAccessTokenSuccessResponse(const net::URLFetcher* source,
     92                                                  std::string* access_token,
     93                                                  int* expires_in);
     94 
     95   static bool ParseGetAccessTokenFailureResponse(const net::URLFetcher* source,
     96                                                  std::string* error);
     97 
     98   // State that is set during construction.
     99   net::URLRequestContextGetter* const getter_;
    100   std::string refresh_token_;
    101   State state_;
    102 
    103   // While a fetch is in progress.
    104   scoped_ptr<net::URLFetcher> fetcher_;
    105   std::string client_id_;
    106   std::string client_secret_;
    107   std::vector<std::string> scopes_;
    108 
    109   friend class OAuth2AccessTokenFetcherImplTest;
    110   FRIEND_TEST_ALL_PREFIXES(OAuth2AccessTokenFetcherImplTest,
    111                            ParseGetAccessTokenResponse);
    112   FRIEND_TEST_ALL_PREFIXES(OAuth2AccessTokenFetcherImplTest,
    113                            MakeGetAccessTokenBody);
    114 
    115   DISALLOW_COPY_AND_ASSIGN(OAuth2AccessTokenFetcherImpl);
    116 };
    117 
    118 #endif  // GOOGLE_APIS_GAIA_OAUTH2_ACCESS_TOKEN_FETCHER_IMPL_H_
    119