Index: Src/GoogleApis.Auth.DotNet4/OAuth2/GoogleWebAuthenticationBroker.cs =================================================================== new file mode 100644 --- /dev/null +++ b/Src/GoogleApis.Auth.DotNet4/OAuth2/GoogleWebAuthenticationBroker.cs @@ -0,0 +1,104 @@ +/* +Copyright 2013 Google Inc + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +using Google.Apis.Util.Store; + +namespace Google.Apis.Auth.OAuth2 +{ + /// A helper utility to manage the authorization code flow. + public class GoogleWebAuthenticationBroker + { + /// The folder which is used by the . + public static string Folder = "Google.Apis.Auth"; + + /// Asynchronously authenticates the specified user. + /// + /// In case no data store is specified, will be used by + /// default. + /// + /// The client secrets. + /// + /// The scopes which indicate the Google API access your application is requesting. + /// + /// The user to authenticate. + /// Cancellation token to cancel an operation. + /// The data store, if not specified a file data store will be used. + /// User credential. + public static async Task AuthenticateAsync(ClientSecrets clientSecrets, + IEnumerable scopes, string user, CancellationToken taskCancellationToken, + IDataStore dataStore = null) + { + var initializer = new GoogleAuthorizationCodeFlow.Initializer + { + ClientSecrets = clientSecrets, + }; + return await AuthenticateAsyncCore(initializer, scopes, user, taskCancellationToken, dataStore); + } + + /// Asynchronously authenticates the specified user. + /// + /// In case no data store is specified, will be used by + /// default. + /// + /// + /// The client secrets stream. The authorization code flow constructor is responsible for disposing the stream. + /// + /// + /// The scopes which indicate the Google API access your application is requesting. + /// + /// The user to authenticate. + /// Cancellation token to cancel an operation. + /// The data store, if not specified a file data store will be used. + /// User credential. + public static async Task AuthenticateAsync(Stream clientSecretsStream, + IEnumerable scopes, string user, CancellationToken taskCancellationToken, + IDataStore dataStore = null) + { + var initializer = new GoogleAuthorizationCodeFlow.Initializer + { + ClientSecretsStream = clientSecretsStream, + }; + return await AuthenticateAsyncCore(initializer, scopes, user, taskCancellationToken, dataStore); + } + + /// The core logic for asynchronously authenticating the specified user. + /// The authorization code initializer. + /// + /// The scopes which indicate the Google API access your application is requesting. + /// + /// The user to authenticate. + /// Cancellation token to cancel an operation. + /// The data store, if not specified a file data store will be used. + /// User credential. + private static async Task AuthenticateAsyncCore(AuthorizationCodeFlow.Initializer initializer, + IEnumerable scopes, string user, CancellationToken taskCancellationToken, + IDataStore dataStore = null) + { + initializer.Scopes = scopes; + initializer.DataStore = dataStore ?? new FileDataStore(Folder); + var flow = new GoogleAuthorizationCodeFlow(initializer); + + // Create authorization code installed app instance and authorize the user. + return await new AuthorizationCodeInstalledApp(flow, new LocalServerCodeReceiver()).Authorize + (user, taskCancellationToken); + } + } +} \ No newline at end of file