oauth_client.h revision 3551c9c881056c480085172ff9840cab31610854
13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file. 43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef REMOTING_HOST_SETUP_OAUTH_CLIENT 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#define REMOTING_HOST_SETUP_OAUTH_CLIENT 73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <queue> 93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <string> 103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/callback.h" 123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "google_apis/gaia/gaia_oauth_client.h" 133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "remoting/base/url_request_context.h" 143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace remoting { 163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// A wrapper around GaiaOAuthClient that provides a more convenient interface, 183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// with queueing of requests and a callback rather than a delegate. 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class OAuthClient : public gaia::GaiaOAuthClient::Delegate { 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public: 213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Called when GetCredentialsFromAuthCode is completed, with the |user_email| 223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // and |refresh_token| that correspond to the given |auth_code|, or with empty 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // strings on error. 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) typedef base::Callback<void( 253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& user_email, 263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& refresh_token)> CompletionCallback; 273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) OAuthClient( 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) scoped_refptr<net::URLRequestContextGetter> url_request_context_getter); 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~OAuthClient(); 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Redeems |auth_code| using |oauth_client_info| to obtain |refresh_token| and 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // |access_token|, then uses the userinfo endpoint to obtain |user_email|. 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Calls CompletionCallback with |user_email| and |refresh_token| when done, 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // or with empty strings on error. 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // If a request is received while another one is being processed, it is 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // enqueued and processed after the first one is finished. 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void GetCredentialsFromAuthCode( 403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const gaia::OAuthClientInfo& oauth_client_info, 413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& auth_code, 423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done); 433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // gaia::GaiaOAuthClient::Delegate 453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnGetTokensResponse(const std::string& refresh_token, 463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& access_token, 473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expires_in_seconds) OVERRIDE; 483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnRefreshTokenResponse(const std::string& access_token, 493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int expires_in_seconds) OVERRIDE; 503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnGetUserEmailResponse(const std::string& user_email) OVERRIDE; 513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnOAuthError() OVERRIDE; 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual void OnNetworkError(int response_code) OVERRIDE; 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) private: 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) struct Request { 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) Request(const gaia::OAuthClientInfo& oauth_client_info, 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& auth_code, 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done); 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) virtual ~Request(); 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gaia::OAuthClientInfo oauth_client_info; 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string auth_code; 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done; 643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) }; 653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) void SendResponse(const std::string& user_email, 673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::string& refresh_token); 683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::queue<Request> pending_requests_; 703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gaia::GaiaOAuthClient gaia_oauth_client_; 713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string refresh_token_; 723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) CompletionCallback on_done_; 733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OAuthClient); 753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}; 763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} // namespace remoting 783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif // REMOTING_HOST_SETUP_OAUTH_CLIENT 80