Chromium Code Reviews| Index: chrome/browser/extensions/api/identity/gaia_web_auth_flow.h |
| diff --git a/chrome/browser/extensions/api/identity/gaia_web_auth_flow.h b/chrome/browser/extensions/api/identity/gaia_web_auth_flow.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8c07cd18eae05bf420fe0782d95575ca83fb183b |
| --- /dev/null |
| +++ b/chrome/browser/extensions/api/identity/gaia_web_auth_flow.h |
| @@ -0,0 +1,93 @@ |
| +// Copyright (c) 2013 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_EXTENSIONS_API_IDENTITY_GAIA_WEB_AUTH_FLOW_H_ |
| +#define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_GAIA_WEB_AUTH_FLOW_H_ |
| + |
| +#include "chrome/browser/extensions/api/identity/web_auth_flow.h" |
| +#include "chrome/browser/signin/ubertoken_fetcher.h" |
| +#include "chrome/browser/ui/host_desktop.h" |
| +#include "chrome/common/extensions/api/identity/oauth2_manifest_handler.h" |
| + |
| +namespace extensions { |
| + |
| +// Implements a web-based OAuth2 scope approval dialog. This flow has |
| +// four parts: |
| +// 1. Fetch an ubertoken for the signed-in user. |
| +// 2. Use the ubertoken to get session cookies using MergeSession. |
| +// 3. Start the OAuth flow and wait for final redirect. |
| +// 4. Parse results from the fragment component of the final redirect URI. |
| +// |
| +// The OAuth flow is a special version of the OAuth2 out-of-band flow |
| +// where the final response page's title contains the |
| +// redirect_uri. The redirect URI has an unusual format to prevent its |
| +// use in other contexts. The scheme of the URI is a reversed version |
| +// of the OAuth client ID, and the path starts with the Chrome |
| +// extension ID. For example, an app with the OAuth client ID |
| +// "32610281651.apps.googleusercontent.com" and a Chrome app ID |
| +// "kbinjhdkhikmpjoejcfofghmjjpidcnj", would get redirected to: |
| +// |
| +// com.googleusercontent.apps.32610281651:/kbinjhdkhikmpjoejcfofghmjjpidcnj |
| +// |
| +// Arriving at this URI completes the flow. The last response from |
| +// gaia does a JavaScript redirect to the special URI, but also |
| +// includes the same URI in its title. The navigation to this URI gets |
| +// filtered out because of its unusual protocol scheme, so |
| +// GaiaWebAuthFlow pulls it out of the window title instead. |
| + |
| +class GaiaWebAuthFlow : public UbertokenConsumer, public WebAuthFlow::Delegate { |
| + public: |
| + enum Failure { |
| + WINDOW_CLOSED, // Window closed by user. |
| + INVALID_REDIRECT, // Redirect parse error. |
| + SERVICE_AUTH_ERROR // Non-OAuth related authentication error |
| + }; |
| + |
| + class Delegate { |
| + public: |
| + virtual void OnGaiaFlowFailure(Failure failure, |
| + GoogleServiceAuthError service_error) = 0; |
| + virtual void OnGaiaFlowCompleted(const std::string& token, |
|
Roger Tawa OOO till Jul 10th
2013/05/16 16:06:15
Change name to |access_token| to make it clearer?
Michael Courage
2013/05/16 20:39:02
Done.
|
| + const std::string& expiration, |
| + const std::string& error) = 0; |
| + }; |
| + |
| + GaiaWebAuthFlow(Delegate* delegate, |
| + Profile* profile, |
| + chrome::HostDesktopType host_desktop_type, |
| + const std::string& extension_id, |
| + const OAuth2Info& oauth2_info); |
| + virtual ~GaiaWebAuthFlow(); |
| + |
| + // Starts the flow by fetching an ubertoken. Can override for testing. |
| + virtual void Start(); |
| + |
| + // UbertokenConsumer implementation: |
| + virtual void OnUbertokenSuccess(const std::string& token) OVERRIDE; |
| + virtual void OnUbertokenFailure(const GoogleServiceAuthError& error) OVERRIDE; |
| + |
| + // WebAuthFlow::Delegate implementation. |
| + virtual void OnAuthFlowFailure(WebAuthFlow::Failure failure) OVERRIDE; |
| + virtual void OnAuthFlowURLChange(const GURL& redirect_url) OVERRIDE; |
| + virtual void OnAuthFlowTitleChange(const std::string& title) OVERRIDE; |
| + |
| + private: |
| + // Creates an interactive flow. Can override for testing. |
|
Roger Tawa OOO till Jul 10th
2013/05/16 16:06:15
Add description of |url| arg.
Michael Courage
2013/05/16 20:39:02
Done.
|
| + virtual scoped_ptr<WebAuthFlow> CreateWebAuthFlow(GURL url); |
| + |
| + Delegate* delegate_; |
| + Profile* profile_; |
| + chrome::HostDesktopType host_desktop_type_; |
| + std::string redirect_scheme_; |
| + std::string redirect_path_prefix_; |
| + std::string auth_url_; |
| + scoped_ptr<UbertokenFetcher> ubertoken_fetcher_; |
| + scoped_ptr<WebAuthFlow> web_flow_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(GaiaWebAuthFlow); |
| +}; |
| + |
| +} // extensions |
| + |
| +#endif // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_GAIA_WEB_AUTH_FLOW_H_ |