1 // Copyright (c) 2012 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.
5 #ifndef GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
6 #define GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_
11 #include "base/gtest_prod_util.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/strings/string16.h"
14 #include "google_apis/gaia/oauth2_api_call_flow.h"
17 class GoogleServiceAuthError;
18 class OAuth2MintTokenFlowTest;
21 class DictionaryValue;
29 class URLRequestContextGetter;
32 // IssueAdvice: messages to show to the user to get a user's approval.
33 // The structure is as follows:
43 struct IssueAdviceInfoEntry {
45 IssueAdviceInfoEntry();
46 ~IssueAdviceInfoEntry();
48 base::string16 description;
49 std::vector<base::string16> details;
51 bool operator==(const IssueAdviceInfoEntry& rhs) const;
54 typedef std::vector<IssueAdviceInfoEntry> IssueAdviceInfo;
56 // This class implements the OAuth2 flow to Google to mint an OAuth2 access
57 // token for the given client and the given set of scopes from the OAuthLogin
58 // scoped "master" OAuth2 token for the user logged in to Chrome.
59 class OAuth2MintTokenFlow : public OAuth2ApiCallFlow {
61 // There are four different modes when minting a token to grant
62 // access to third-party app for a user.
64 // Get the messages to display to the user without minting a token.
66 // Record a grant but do not get a token back.
68 // Mint a token for an existing grant.
69 MODE_MINT_TOKEN_NO_FORCE,
70 // Mint a token forcefully even if there is no existing grant.
71 MODE_MINT_TOKEN_FORCE,
74 // Parameters needed to mint a token.
78 Parameters(const std::string& eid,
79 const std::string& cid,
80 const std::vector<std::string>& scopes_arg,
81 const std::string& device_id,
85 std::string extension_id;
86 std::string client_id;
87 std::vector<std::string> scopes;
88 std::string device_id;
94 virtual void OnMintTokenSuccess(const std::string& access_token,
96 virtual void OnIssueAdviceSuccess(const IssueAdviceInfo& issue_advice) {}
97 virtual void OnMintTokenFailure(const GoogleServiceAuthError& error) {}
100 virtual ~Delegate() {}
103 OAuth2MintTokenFlow(Delegate* delegate, const Parameters& parameters);
104 ~OAuth2MintTokenFlow() override;
107 // Implementation of template methods in OAuth2ApiCallFlow.
108 GURL CreateApiCallUrl() override;
109 std::string CreateApiCallBody() override;
111 void ProcessApiCallSuccess(const net::URLFetcher* source) override;
112 void ProcessApiCallFailure(const net::URLFetcher* source) override;
115 friend class OAuth2MintTokenFlowTest;
116 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, CreateApiCallBody);
117 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseIssueAdviceResponse);
118 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ParseMintTokenResponse);
119 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallSuccess);
120 FRIEND_TEST_ALL_PREFIXES(OAuth2MintTokenFlowTest, ProcessApiCallFailure);
122 void ReportSuccess(const std::string& access_token, int time_to_live);
123 void ReportIssueAdviceSuccess(const IssueAdviceInfo& issue_advice);
124 void ReportFailure(const GoogleServiceAuthError& error);
126 static bool ParseIssueAdviceResponse(
127 const base::DictionaryValue* dict, IssueAdviceInfo* issue_advice);
128 static bool ParseMintTokenResponse(
129 const base::DictionaryValue* dict, std::string* access_token,
133 Parameters parameters_;
134 base::WeakPtrFactory<OAuth2MintTokenFlow> weak_factory_;
136 DISALLOW_COPY_AND_ASSIGN(OAuth2MintTokenFlow);
139 #endif // GOOGLE_APIS_GAIA_OAUTH2_MINT_TOKEN_FLOW_H_