Commit 11e0af71 authored by Valeriya Sinevich's avatar Valeriya Sinevich Committed by Commit Bot

[Signin] Send request to gaia and return OauthMultiloginResult (not parsed).

Send request o gaia Multilogin endpoint to receive cookies for chrome accounts. Store them in OauthMultiloginResult class.

Change-Id: I7e7ed46b8a21369b95176522b58ea3de8a305048
Reviewed-on: https://chromium-review.googlesource.com/1172426
Commit-Queue: Valeriya Sinevich <valeriyas@google.com>
Reviewed-by: default avatarRamin Halavati <rhalavati@chromium.org>
Reviewed-by: default avatarDavid Roger <droger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586282}
parent 9c7302b7
......@@ -715,12 +715,10 @@ void GaiaCookieManagerService::OnGetTokenSuccess(
void GaiaCookieManagerService::OnGetTokenFailure(
const OAuth2TokenService::Request* request,
const GoogleServiceAuthError& error) {
// TODO (valeriyas): Implement OnMultiloginFailure in this class and call it
// here.
token_requests_.clear();
VLOG(1) << "Failed to retrieve accesstoken"
<< " account=" << request->GetAccountId()
<< " error=" << error.ToString();
OnOAuthMultiloginFailure(error);
}
void GaiaCookieManagerService::OnMergeSessionSuccess(const std::string& data) {
......@@ -766,6 +764,27 @@ void GaiaCookieManagerService::OnMergeSessionFailure(
SignalComplete(account_id, error);
}
void GaiaCookieManagerService::OnOAuthMultiloginSuccess(
const OAuthMultiloginResult& result) {
DCHECK(requests_.front().request_type() ==
GaiaCookieRequestType::SET_ACCOUNTS);
VLOG(1) << "Multilogin successful accounts="
<< base::JoinString(requests_.front().account_ids(), " ");
std::vector<std::string> account_ids = requests_.front().account_ids();
access_tokens_.clear();
HandleNextRequest();
}
void GaiaCookieManagerService::OnOAuthMultiloginFailure(
const GoogleServiceAuthError& error) {
VLOG(1) << "Failed Multilogin "
<< base::JoinString(requests_.front().account_ids(), " ")
<< " error=" << error.ToString();
access_tokens_.clear();
token_requests_.clear();
HandleNextRequest();
}
void GaiaCookieManagerService::OnListAccountsSuccess(const std::string& data) {
VLOG(1) << "ListAccounts successful";
DCHECK(requests_.front().request_type() ==
......
......@@ -19,6 +19,7 @@
#include "components/signin/core/browser/signin_client.h"
#include "google_apis/gaia/gaia_auth_consumer.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "google_apis/gaia/oauth_multilogin_result.h"
#include "google_apis/gaia/ubertoken_fetcher.h"
#include "mojo/public/cpp/bindings/binding.h"
#include "net/base/backoff_entry.h"
......@@ -288,6 +289,8 @@ class GaiaCookieManagerService : public KeyedService,
// Overridden from GaiaAuthConsumer.
void OnMergeSessionSuccess(const std::string& data) override;
void OnMergeSessionFailure(const GoogleServiceAuthError& error) override;
void OnOAuthMultiloginSuccess(const OAuthMultiloginResult& result) override;
void OnOAuthMultiloginFailure(const GoogleServiceAuthError& error) override;
void OnListAccountsSuccess(const std::string& data) override;
void OnListAccountsFailure(const GoogleServiceAuthError& error) override;
void OnLogOutSuccess() override;
......
......@@ -120,6 +120,8 @@ template("google_apis_tmpl") {
"gaia/oauth2_token_service_delegate.h",
"gaia/oauth2_token_service_request.cc",
"gaia/oauth2_token_service_request.h",
"gaia/oauth_multilogin_result.cc",
"gaia/oauth_multilogin_result.h",
"gaia/oauth_request_signer.cc",
"gaia/oauth_request_signer.h",
"gaia/ubertoken_fetcher.cc",
......
......@@ -10,6 +10,7 @@
#include <vector>
class GoogleServiceAuthError;
class OAuthMultiloginResult;
namespace net {
typedef std::vector<std::string> ResponseCookies;
......@@ -115,6 +116,9 @@ class GaiaAuthConsumer {
virtual void OnListAccountsSuccess(const std::string& data) {}
virtual void OnListAccountsFailure(const GoogleServiceAuthError& error) {}
virtual void OnOAuthMultiloginSuccess(const OAuthMultiloginResult& result) {}
virtual void OnOAuthMultiloginFailure(const GoogleServiceAuthError& error) {}
virtual void OnLogOutSuccess() {}
virtual void OnLogOutFailure(const GoogleServiceAuthError& error) {}
......
......@@ -23,6 +23,7 @@
#include "google_apis/gaia/gaia_urls.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "google_apis/gaia/oauth2_id_token_decoder.h"
#include "google_apis/gaia/oauth_multilogin_result.h"
#include "net/base/escape.h"
#include "net/base/load_flags.h"
#include "net/http/http_response_headers.h"
......@@ -191,6 +192,9 @@ const char GaiaAuthFetcher::kAuthHeaderFormat[] =
// static
const char GaiaAuthFetcher::kOAuthHeaderFormat[] = "Authorization: OAuth %s";
// static
const char GaiaAuthFetcher::kOAuthMultiBearerHeaderFormat[] =
"Authorization: MultiBearer %s";
// static
const char GaiaAuthFetcher::kOAuth2BearerHeaderFormat[] =
"Authorization: Bearer %s";
// static
......@@ -221,6 +225,7 @@ GaiaAuthFetcher::GaiaAuthFetcher(
uberauth_token_gurl_(GaiaUrls::GetInstance()->oauth1_login_url().Resolve(
base::StringPrintf(kUberAuthTokenURLFormat, source.c_str()))),
oauth_login_gurl_(GaiaUrls::GetInstance()->oauth1_login_url()),
oauth_multilogin_gurl_(GaiaUrls::GetInstance()->oauth_multilogin_url()),
list_accounts_gurl_(
GaiaUrls::GetInstance()->ListAccountsURLWithSource(source)),
logout_gurl_(GaiaUrls::GetInstance()->LogOutURLWithSource(source)),
......@@ -850,7 +855,53 @@ void GaiaAuthFetcher::StartListAccounts() {
void GaiaAuthFetcher::StartOAuthMultilogin(
const std::vector<MultiloginTokenIDPair>& accounts) {
// TODO (valeriyas): Implement sending request to gaia.
DCHECK(!fetch_pending_) << "Tried to fetch two things at once!";
std::vector<std::string> authorization_header_parts;
for (const MultiloginTokenIDPair& account : accounts) {
authorization_header_parts.push_back(base::StringPrintf(
"%s:%s", account.token_.c_str(), account.gaia_id_.c_str()));
}
std::string authorization_header = base::StringPrintf(
kOAuthMultiBearerHeaderFormat,
base::JoinString(authorization_header_parts, ",").c_str());
std::string parameters = base::StringPrintf(
"?source=%s", net::EscapeUrlEncodedData(source_, true).c_str());
net::NetworkTrafficAnnotationTag traffic_annotation =
net::DefineNetworkTrafficAnnotation("gaia_auth_multilogin", R"(
semantics {
sender: "Chrome - Google authentication API"
description:
"This request is used to set chrome accounts in browser in the "
"Google authentication cookies for several google websites "
"(e.g. youtube)."
trigger:
"This request is part of Gaia Auth API, and is triggered whenever "
"accounts in cookies are not consistent with accounts in browser."
data:
"This request includes the vector of account ids and auth-login "
"tokens."
destination: GOOGLE_OWNED_SERVICE
}
policy {
cookies_allowed: YES
cookies_store: "user"
setting:
"This feature cannot be disabled in settings, but if the user "
"signs out of Chrome, this request would not be made."
chrome_policy {
SigninAllowed {
SigninAllowed: false
}
}
})");
CreateAndStartGaiaFetcher(" ", // Non-empty to force a POST
authorization_header,
oauth_multilogin_gurl_.Resolve(parameters),
net::LOAD_NORMAL, traffic_annotation);
}
void GaiaAuthFetcher::StartLogOut() {
......@@ -1123,6 +1174,17 @@ void GaiaAuthFetcher::OnGetCheckConnectionInfoFetched(const std::string& data,
}
}
void GaiaAuthFetcher::OnOAuthMultiloginFetched(const std::string& data,
net::Error net_error,
int response_code) {
if (net_error == net::Error::OK && response_code == net::HTTP_OK) {
OAuthMultiloginResult result(data);
consumer_->OnOAuthMultiloginSuccess(result);
} else {
consumer_->OnOAuthMultiloginFailure(GenerateAuthError(data, net_error));
}
}
void GaiaAuthFetcher::OnURLLoadComplete(
std::unique_ptr<std::string> response_body) {
net::Error net_error = static_cast<net::Error>(url_loader_->NetError());
......@@ -1179,6 +1241,9 @@ void GaiaAuthFetcher::DispatchFetchedRequest(
OnUberAuthTokenFetch(data, net_error, response_code);
} else if (url == oauth_login_gurl_) {
OnOAuthLoginFetched(data, net_error, response_code);
} else if (base::StartsWith(url.spec(), oauth_multilogin_gurl_.spec(),
base::CompareCase::SENSITIVE)) {
OnOAuthMultiloginFetched(data, net_error, response_code);
} else if (url == oauth2_revoke_gurl_) {
OnOAuth2RevokeTokenFetched(data, net_error, response_code);
} else if (url == list_accounts_gurl_) {
......
......@@ -282,6 +282,7 @@ class GaiaAuthFetcher {
static const char kOAuthHeaderFormat[];
static const char kOAuth2BearerHeaderFormat[];
static const char kDeviceIdHeaderFormat[];
static const char kOAuthMultiBearerHeaderFormat[];
static const char kClientLoginToOAuth2CookiePartSecure[];
static const char kClientLoginToOAuth2CookiePartHttpOnly[];
static const char kClientLoginToOAuth2CookiePartCodePrefix[];
......@@ -322,6 +323,10 @@ class GaiaAuthFetcher {
net::Error net_error,
int response_code);
void OnOAuthMultiloginFetched(const std::string& data,
net::Error net_error,
int response_code);
void OnOAuthLoginFetched(const std::string& data,
net::Error net_error,
int response_code);
......@@ -399,6 +404,7 @@ class GaiaAuthFetcher {
const GURL merge_session_gurl_;
const GURL uberauth_token_gurl_;
const GURL oauth_login_gurl_;
const GURL oauth_multilogin_gurl_;
const GURL list_accounts_gurl_;
const GURL logout_gurl_;
const GURL get_check_connection_info_url_;
......
......@@ -34,6 +34,7 @@ const char kMergeSessionUrlSuffix[] = "MergeSession";
const char kOAuthGetAccessTokenUrlSuffix[] = "OAuthGetAccessToken";
const char kOAuthWrapBridgeUrlSuffix[] = "OAuthWrapBridge";
const char kOAuth1LoginUrlSuffix[] = "OAuthLogin";
const char kOAuthMultiloginSuffix[] = "oauth/multilogin";
const char kOAuthRevokeTokenUrlSuffix[] = "AuthSubRevokeToken";
const char kListAccountsSuffix[] = "ListAccounts?json=standard";
const char kEmbeddedSigninSuffix[] = "embedded/setup/chrome/usermenu";
......@@ -111,6 +112,7 @@ GaiaUrls::GaiaUrls() {
get_user_info_url_ = gaia_url_.Resolve(kGetUserInfoUrlSuffix);
token_auth_url_ = gaia_url_.Resolve(kTokenAuthUrlSuffix);
merge_session_url_ = gaia_url_.Resolve(kMergeSessionUrlSuffix);
oauth_multilogin_url_ = gaia_url_.Resolve(kOAuthMultiloginSuffix);
oauth_get_access_token_url_ =
gaia_url_.Resolve(kOAuthGetAccessTokenUrlSuffix);
oauth_wrap_bridge_url_ = gaia_url_.Resolve(kOAuthWrapBridgeUrlSuffix);
......@@ -201,6 +203,10 @@ const GURL& GaiaUrls::get_oauth_token_url() const {
return get_oauth_token_url_;
}
const GURL& GaiaUrls::oauth_multilogin_url() const {
return oauth_multilogin_url_;
}
const GURL& GaiaUrls::oauth_get_access_token_url() const {
return oauth_get_access_token_url_;
}
......
......@@ -31,6 +31,7 @@ class GaiaUrls {
const GURL& merge_session_url() const;
const GURL& get_oauth_token_url() const;
const GURL& oauth_get_access_token_url() const;
const GURL& oauth_multilogin_url() const;
const GURL& oauth_wrap_bridge_url() const;
const GURL& oauth_user_info_url() const;
const GURL& oauth_revoke_token_url() const;
......@@ -82,6 +83,7 @@ class GaiaUrls {
GURL get_oauth_token_url_;
GURL oauth_get_access_token_url_;
GURL oauth_wrap_bridge_url_;
GURL oauth_multilogin_url_;
GURL oauth_user_info_url_;
GURL oauth_revoke_token_url_;
GURL oauth1_login_url_;
......
// Copyright 2017 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.
#include "google_apis/gaia/oauth_multilogin_result.h"
OAuthMultiloginResult::OAuthMultiloginResult(const std::string& data) {
// TODO (valeriyas): parse OAuthMultiloginResult here;
}
OAuthMultiloginResult::~OAuthMultiloginResult() = default;
\ No newline at end of file
// Copyright 2017 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 GOOGLE_APIS_GAIA_OAUTH_MULTILOGIN_RESULT_H_
#define GOOGLE_APIS_GAIA_OAUTH_MULTILOGIN_RESULT_H_
#include <string>
#include <unordered_map>
#include "base/time/time.h"
#include "base/values.h"
#include "google_apis/gaia/gaia_auth_util.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_constants.h"
#include "net/url_request/url_request_status.h"
#include "url/gurl.h"
class OAuthMultiloginResult {
public:
std::vector<net::CanonicalCookie> cookies() const { return cookies_; }
OAuthMultiloginResult(const std::string& data);
~OAuthMultiloginResult();
private:
std::vector<net::CanonicalCookie> cookies_;
};
#endif // GOOGLE_APIS_GAIA_OAUTH_MULTILOGIN_RESULT_H_
\ No newline at end of file
......@@ -109,6 +109,7 @@ Refer to README.md for content description and update process.
<item id="gaia_auth_log_out" hash_code="116426676" type="0" content_hash_code="91154233" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_auth_login" hash_code="91597383" type="0" content_hash_code="111911548" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_auth_merge_sessions" hash_code="26216847" type="0" content_hash_code="30423843" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_auth_multilogin" hash_code="31445884" type="0" content_hash_code="77730858" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_auth_revoke_token" hash_code="133982351" type="0" content_hash_code="96665330" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_cookie_manager_external_cc_result" hash_code="4300475" type="0" content_hash_code="31188375" os_list="linux,windows" file_path="components/signin/core/browser/gaia_cookie_manager_service.cc"/>
<item id="gaia_oauth_client_get_token_info" hash_code="32585152" type="0" content_hash_code="128143346" os_list="linux,windows" file_path="google_apis/gaia/gaia_oauth_client.cc"/>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment