Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: chrome/browser/extensions/api/identity/identity_api.h

Issue 14329014: Identity API: Add token cache and identity.invalidateAuthToken. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix invalidation crash and stale tokens for signed out users Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_ 5 #ifndef CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_ 6 #define CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 82
83 // Initiate/complete the sub-flows. 83 // Initiate/complete the sub-flows.
84 void StartSigninFlow(); 84 void StartSigninFlow();
85 void StartMintTokenFlow(IdentityMintRequestQueue::MintType type); 85 void StartMintTokenFlow(IdentityMintRequestQueue::MintType type);
86 void CompleteMintTokenFlow(); 86 void CompleteMintTokenFlow();
87 87
88 // IdentityMintRequestQueue::Request implementation: 88 // IdentityMintRequestQueue::Request implementation:
89 virtual void StartMintToken(IdentityMintRequestQueue::MintType type) OVERRIDE; 89 virtual void StartMintToken(IdentityMintRequestQueue::MintType type) OVERRIDE;
90 90
91 // OAuth2MintTokenFlow::Delegate implementation: 91 // OAuth2MintTokenFlow::Delegate implementation:
92 virtual void OnMintTokenSuccess(const std::string& access_token) OVERRIDE; 92 virtual void OnMintTokenSuccess(const std::string& access_token,
93 int time_to_live) OVERRIDE;
93 virtual void OnMintTokenFailure( 94 virtual void OnMintTokenFailure(
94 const GoogleServiceAuthError& error) OVERRIDE; 95 const GoogleServiceAuthError& error) OVERRIDE;
95 virtual void OnIssueAdviceSuccess( 96 virtual void OnIssueAdviceSuccess(
96 const IssueAdviceInfo& issue_advice) OVERRIDE; 97 const IssueAdviceInfo& issue_advice) OVERRIDE;
97 98
98 // IdentitySigninFlow::Delegate implementation: 99 // IdentitySigninFlow::Delegate implementation:
99 virtual void SigninSuccess(const std::string& token) OVERRIDE; 100 virtual void SigninSuccess(const std::string& token) OVERRIDE;
100 virtual void SigninFailed() OVERRIDE; 101 virtual void SigninFailed() OVERRIDE;
101 102
102 // ExtensionInstallPrompt::Delegate implementation: 103 // ExtensionInstallPrompt::Delegate implementation:
(...skipping 19 matching lines...) Expand all
122 std::string refresh_token_; 123 std::string refresh_token_;
123 bool should_prompt_for_signin_; 124 bool should_prompt_for_signin_;
124 125
125 // When launched in interactive mode, and if there is no existing grant, 126 // When launched in interactive mode, and if there is no existing grant,
126 // a permissions prompt will be popped up to the user. 127 // a permissions prompt will be popped up to the user.
127 IssueAdviceInfo issue_advice_; 128 IssueAdviceInfo issue_advice_;
128 scoped_ptr<ExtensionInstallPrompt> install_ui_; 129 scoped_ptr<ExtensionInstallPrompt> install_ui_;
129 scoped_ptr<IdentitySigninFlow> signin_flow_; 130 scoped_ptr<IdentitySigninFlow> signin_flow_;
130 }; 131 };
131 132
133 class IdentityInvalidateAuthTokenFunction : public SyncExtensionFunction {
134 public:
135 DECLARE_EXTENSION_FUNCTION("experimental.identity.invalidateAuthToken",
136 EXPERIMENTAL_IDENTITY_INVALIDATEAUTHTOKEN)
137 IdentityInvalidateAuthTokenFunction();
138
139 protected:
140 virtual ~IdentityInvalidateAuthTokenFunction();
141
142 // SyncExtensionFunction implementation:
143 virtual bool RunImpl() OVERRIDE;
144 };
145
132 class IdentityLaunchWebAuthFlowFunction : public AsyncExtensionFunction, 146 class IdentityLaunchWebAuthFlowFunction : public AsyncExtensionFunction,
133 public WebAuthFlow::Delegate { 147 public WebAuthFlow::Delegate {
134 public: 148 public:
135 DECLARE_EXTENSION_FUNCTION("experimental.identity.launchWebAuthFlow", 149 DECLARE_EXTENSION_FUNCTION("experimental.identity.launchWebAuthFlow",
136 EXPERIMENTAL_IDENTITY_LAUNCHWEBAUTHFLOW) 150 EXPERIMENTAL_IDENTITY_LAUNCHWEBAUTHFLOW)
137 151
138 IdentityLaunchWebAuthFlowFunction(); 152 IdentityLaunchWebAuthFlowFunction();
139 153
140 // URL checking helpers. Public for testing. 154 // URL checking helpers. Public for testing.
141 // Checks to see if the current URL ends the flow. 155 // Checks to see if the current URL ends the flow.
(...skipping 10 matching lines...) Expand all
152 virtual void OnAuthFlowFailure(WebAuthFlow::Failure failure) OVERRIDE; 166 virtual void OnAuthFlowFailure(WebAuthFlow::Failure failure) OVERRIDE;
153 virtual void OnAuthFlowURLChange(const GURL& redirect_url) OVERRIDE; 167 virtual void OnAuthFlowURLChange(const GURL& redirect_url) OVERRIDE;
154 168
155 // Helper to initialize final URLs vector. 169 // Helper to initialize final URLs vector.
156 void InitFinalRedirectURLPrefixes(const std::string& extension_id); 170 void InitFinalRedirectURLPrefixes(const std::string& extension_id);
157 171
158 scoped_ptr<WebAuthFlow> auth_flow_; 172 scoped_ptr<WebAuthFlow> auth_flow_;
159 std::vector<GURL> final_prefixes_; 173 std::vector<GURL> final_prefixes_;
160 }; 174 };
161 175
176 class IdentityTokenCacheValue {
177 public:
178 IdentityTokenCacheValue();
179 explicit IdentityTokenCacheValue(const IssueAdviceInfo& issue_advice);
180 IdentityTokenCacheValue(const std::string& token,
181 base::TimeDelta time_to_live);
182 ~IdentityTokenCacheValue();
183
184 // Order of these entries is used to determine whether or not new
185 // entries supercede older ones in SetCachedToken.
186 enum CacheValueStatus {
187 CACHE_STATUS_NOTFOUND,
188 CACHE_STATUS_ADVICE,
189 CACHE_STATUS_TOKEN
190 };
191
192 CacheValueStatus status() const;
193 const IssueAdviceInfo& issue_advice() const;
194 const std::string& token() const;
195
196 private:
197 bool is_expired() const;
198
199 CacheValueStatus status_;
200 IssueAdviceInfo issue_advice_;
201 std::string token_;
202 base::Time expiration_time_;
203 };
204
162 class IdentityAPI : public ProfileKeyedAPI, 205 class IdentityAPI : public ProfileKeyedAPI,
163 public SigninGlobalError::AuthStatusProvider, 206 public SigninGlobalError::AuthStatusProvider,
164 public content::NotificationObserver { 207 public content::NotificationObserver {
165 public: 208 public:
166 explicit IdentityAPI(Profile* profile); 209 explicit IdentityAPI(Profile* profile);
167 virtual ~IdentityAPI(); 210 virtual ~IdentityAPI();
168 void Initialize(); 211 void Initialize();
169 212
170 // Request serialization queue for getAuthToken. 213 // Request serialization queue for getAuthToken.
171 IdentityMintRequestQueue* mint_queue(); 214 IdentityMintRequestQueue* mint_queue();
172 215
216 // Token cache
217 void SetCachedToken(const std::string& extension_id,
218 const std::vector<std::string> scopes,
219 const IdentityTokenCacheValue& token_data);
220 void EraseCachedToken(const std::string& extension_id,
221 const std::string& token);
222 void EraseAllCachedTokens();
223 const IdentityTokenCacheValue& GetCachedToken(
224 const std::string& extension_id, const std::vector<std::string> scopes);
225
173 void ReportAuthError(const GoogleServiceAuthError& error); 226 void ReportAuthError(const GoogleServiceAuthError& error);
174 227
175 // ProfileKeyedAPI implementation. 228 // ProfileKeyedAPI implementation.
176 virtual void Shutdown() OVERRIDE; 229 virtual void Shutdown() OVERRIDE;
177 static ProfileKeyedAPIFactory<IdentityAPI>* GetFactoryInstance(); 230 static ProfileKeyedAPIFactory<IdentityAPI>* GetFactoryInstance();
178 231
179 // AuthStatusProvider implementation. 232 // AuthStatusProvider implementation.
180 virtual GoogleServiceAuthError GetAuthStatus() const OVERRIDE; 233 virtual GoogleServiceAuthError GetAuthStatus() const OVERRIDE;
181 234
182 // content::NotificationObserver implementation. 235 // content::NotificationObserver implementation.
183 virtual void Observe(int type, 236 virtual void Observe(int type,
184 const content::NotificationSource& source, 237 const content::NotificationSource& source,
185 const content::NotificationDetails& details) OVERRIDE; 238 const content::NotificationDetails& details) OVERRIDE;
186 239
187 private: 240 private:
188 friend class ProfileKeyedAPIFactory<IdentityAPI>; 241 friend class ProfileKeyedAPIFactory<IdentityAPI>;
189 242
243 struct TokenCacheKey {
244 TokenCacheKey(const std::string& extension_id,
245 const std::set<std::string> scopes);
246 ~TokenCacheKey();
247 bool operator<(const TokenCacheKey& rhs) const;
248 std::string extension_id;
249 std::set<std::string> scopes;
250 };
251
190 // ProfileKeyedAPI implementation. 252 // ProfileKeyedAPI implementation.
191 static const char* service_name() { 253 static const char* service_name() {
192 return "IdentityAPI"; 254 return "IdentityAPI";
193 } 255 }
194 static const bool kServiceIsNULLWhileTesting = true; 256 static const bool kServiceIsNULLWhileTesting = true;
195 257
196 Profile* profile_; 258 Profile* profile_;
197 SigninManager* signin_manager_; 259 SigninManager* signin_manager_;
198 GoogleServiceAuthError error_; 260 GoogleServiceAuthError error_;
199 // Used to listen to notifications from the TokenService. 261 // Used to listen to notifications from the TokenService.
200 content::NotificationRegistrar registrar_; 262 content::NotificationRegistrar registrar_;
201 IdentityMintRequestQueue mint_queue_; 263 IdentityMintRequestQueue mint_queue_;
264 std::map<TokenCacheKey, IdentityTokenCacheValue> token_cache_;
202 }; 265 };
203 266
204 template <> 267 template <>
205 void ProfileKeyedAPIFactory<IdentityAPI>::DeclareFactoryDependencies(); 268 void ProfileKeyedAPIFactory<IdentityAPI>::DeclareFactoryDependencies();
206 269
207 } // namespace extensions 270 } // namespace extensions
208 271
209 #endif // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_ 272 #endif // CHROME_BROWSER_EXTENSIONS_API_IDENTITY_IDENTITY_API_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698