Index: Src/GoogleApis.Auth.WP81/OAuth2/GoogleWebAuthorizationBroker.cs |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/Src/GoogleApis.Auth.WP81/OAuth2/GoogleWebAuthorizationBroker.cs |
@@ -0,0 +1,107 @@ |
+/* |
+Copyright 2014 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; |
+using System.Collections.Generic; |
+using System.IO; |
+using System.Text; |
+using System.Threading; |
+using System.Threading.Tasks; |
+using Windows.Storage; |
+ |
+using Google.Apis.Auth.OAuth2.Flows; |
+using Google.Apis.Util.Store; |
+ |
+namespace Google.Apis.Auth.OAuth2 |
+{ |
+ /// <summary>A helper utility to manage the authorization code flow.</summary> |
+ public class GoogleWebAuthorizationBroker |
+ { |
+ /// <summary>Asynchronously authorizes the specified user.</summary> |
+ /// <remarks> |
+ /// It uses <see cref="Google.Apis.Util.Store.PasswordVaultDataStore"/> as the flow's data store by default. |
+ /// </remarks> |
+ /// <param name="clientSecretsUri">The client secrets URI.</param> |
+ /// <param name="scopes"> |
+ /// The scopes which indicate the Google API access your application is requesting. |
+ /// </param> |
+ /// <param name="user">The user to authorize.</param> |
+ /// <param name="taskCancellationToken">Cancellation token to cancel an operation.</param> |
+ /// <returns>User credential.</returns> |
+ public static async Task<UserCredential> AuthorizeAsync(Uri clientSecretsUri, IEnumerable<string> scopes, |
+ string user, CancellationToken taskCancellationToken) |
+ { |
+ var clientSecrets = await LoadClientSecrets(clientSecretsUri).ConfigureAwait(false); |
+ return await AuthorizeAsync(clientSecrets, scopes, user, taskCancellationToken).ConfigureAwait(false); |
+ } |
+ |
+ /// <summary> |
+ /// Asynchronously reauthorizes the user. This method should be called if the users want to authorize after |
+ /// they revoked the token. |
+ /// </summary> |
+ /// <param name="userCredential">The current user credential. Its <see cref="UserCredential.Token"/> will be |
+ /// updated. </param> |
+ /// <param name="taskCancellationToken">Cancellation token to cancel an operation.</param> |
+ public static async Task ReauthorizeAsync(UserCredential userCredential, |
+ CancellationToken taskCancellationToken) |
+ { |
+ var installedApp = new AuthorizationCodeWPInstalledApp(userCredential.Flow); |
+ // Create an authorization code installed app instance and authorize the user. |
+ UserCredential newUserCredential = await installedApp.AuthorizeAsync( |
+ userCredential.UserId, taskCancellationToken).ConfigureAwait(false); |
+ userCredential.Token = newUserCredential.Token; |
+ } |
+ |
+ /// <summary>Asynchronously authorizes the specified user.</summary> |
+ /// <remarks> |
+ /// It uses <see cref="Google.Apis.Util.Store.PasswordVaultDataStore"/> as the flow's data store by default. |
+ /// </remarks> |
+ /// <param name="clientSecrets">The client secrets URI.</param> |
+ /// <param name="scopes"> |
+ /// The scopes which indicate the Google API access your application is requesting. |
+ /// </param> |
+ /// <param name="user">The user to authorize.</param> |
+ /// <param name="taskCancellationToken">Cancellation token to cancel an operation.</param> |
+ /// <returns>User credential.</returns> |
+ private static async Task<UserCredential> AuthorizeAsync(ClientSecrets clientSecrets, |
+ IEnumerable<string> scopes, string user, CancellationToken taskCancellationToken) |
+ { |
+ var initializer = new GoogleAuthorizationCodeFlow.Initializer |
+ { |
+ ClientSecrets = clientSecrets, |
+ Scopes = scopes, |
+ DataStore = new PasswordVaultDataStore() |
+ }; |
+ |
+ var installedApp = new AuthorizationCodeWPInstalledApp(new GoogleAuthorizationCodeFlow(initializer)); |
+ return await installedApp.AuthorizeAsync(user, taskCancellationToken).ConfigureAwait(false); |
+ } |
+ |
+ /// <summary>Loads the client secrets from the given URI.</summary> |
+ /// <param name="clientSecretsUri">The client secrets URI.</param> |
+ /// <returns>Client secrets.</returns> |
+ private static async Task<ClientSecrets> LoadClientSecrets(Uri clientSecretsUri) |
+ { |
+ var file = await StorageFile.GetFileFromApplicationUriAsync(clientSecretsUri); |
+ var content = await FileIO.ReadTextAsync(file); |
+ |
+ using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(content))) |
+ { |
+ return GoogleClientSecrets.Load(stream).Secrets; |
+ } |
+ } |
+ } |
+} |