oauth2_token_fetcher.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SIGNIN_OAUTH2_TOKEN_FETCHER_H_
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_LOGIN_SIGNIN_OAUTH2_TOKEN_FETCHER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "google_apis/gaia/gaia_auth_fetcher.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLRequestContextGetter;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// OAuth2TokenFetcher is used to convert authenticated cookie jar from the
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// authentication profile into OAuth2 tokens and GAIA credentials that will be
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// used to kick off other token retrieval tasks.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OAuth2TokenFetcher : public base::SupportsWeakPtr<OAuth2TokenFetcher>,
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           public GaiaAuthConsumer {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Delegate {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~Delegate() {}
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnOAuth2TokensAvailable(
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const GaiaAuthConsumer::ClientOAuthResult& oauth2_tokens) = 0;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void OnOAuth2TokensFetchFailed() = 0;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OAuth2TokenFetcher(OAuth2TokenFetcher::Delegate* delegate,
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     net::URLRequestContextGetter* context_getter);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OAuth2TokenFetcher();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void StartExchangeFromCookies(const std::string& session_index,
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                const std::string& signin_scoped_device_id);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartExchangeFromAuthCode(const std::string& auth_code);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Decides how to proceed on GAIA |error|. If the error looks temporary,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // retries |task| until max retry count is reached.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If retry count runs out, or error condition is unrecoverable, it runs
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |error_handler|.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RetryOnError(const GoogleServiceAuthError& error,
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const base::Closure& task,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    const base::Closure& error_handler);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // GaiaAuthConsumer overrides.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnClientOAuthSuccess(
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GaiaAuthConsumer::ClientOAuthResult& result) OVERRIDE;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnClientOAuthFailure(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GoogleServiceAuthError& error) OVERRIDE;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OAuth2TokenFetcher::Delegate* delegate_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GaiaAuthConsumer::ClientOAuthResult oauth_tokens_;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GaiaAuthFetcher auth_fetcher_;
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The retry counter. Increment this only when failure happened.
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int retry_count_;
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string session_index_;
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string signin_scoped_device_id_;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string auth_code_;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OAuth2TokenFetcher);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace chromeos
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_SIGNIN_OAUTH2_TOKEN_FETCHER_H_
76