Created
July 25, 2017 21:48
-
-
Save JerryNixon/66d5a235e5d394ec26272899f9231499 to your computer and use it in GitHub Desktop.
Microsoft's Graph API SDK Helper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. | |
//See LICENSE in the project root for license information. | |
using System; | |
using System.Diagnostics; | |
using System.Net.Http.Headers; | |
using System.Net.Http; | |
using System.Linq; | |
using System.Threading.Tasks; | |
using Windows.Security.Authentication.Web; | |
using Windows.Security.Authentication.Web.Core; | |
using Windows.Security.Credentials; | |
using Windows.Storage; | |
using Microsoft.Graph; | |
using Microsoft.Identity.Client; | |
using App6_MSA; | |
namespace Microsoft_Graph_UWP_Connect_SDK | |
{ | |
public class AuthenticationHelper | |
{ | |
// The Client ID is used by the application to uniquely identify itself to the v2.0 authentication endpoint. | |
static string clientId = App.Current.Resources["ida:ClientID"].ToString(); | |
public static string[] Scopes = { "User.Read", "Mail.Send", "Files.ReadWrite" }; | |
public static PublicClientApplication IdentityClientApp = new PublicClientApplication(clientId); | |
public static string TokenForUser = null; | |
public static DateTimeOffset Expiration; | |
private static GraphServiceClient graphClient = null; | |
// Get an access token for the given context and resourceId. An attempt is first made to | |
// acquire the token silently. If that fails, then we try to acquire the token by prompting the user. | |
public static GraphServiceClient GetAuthenticatedClient() | |
{ | |
if (graphClient == null) | |
{ | |
// Create Microsoft Graph client. | |
try | |
{ | |
graphClient = new GraphServiceClient( | |
"https://graph.microsoft.com/v1.0", | |
new DelegateAuthenticationProvider( | |
async (requestMessage) => | |
{ | |
var token = await GetTokenForUserAsync(); | |
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token); | |
// This header has been added to identify our sample in the Microsoft Graph service. If extracting this code for your project please remove. | |
requestMessage.Headers.Add("SampleID", "uwp-csharp-connect-sample"); | |
})); | |
return graphClient; | |
} | |
catch (Exception ex) | |
{ | |
Debug.WriteLine("Could not create a graph client: " + ex.Message); | |
} | |
} | |
return graphClient; | |
} | |
/// <summary> | |
/// Get Token for User. | |
/// </summary> | |
/// <returns>Token for user.</returns> | |
public static async Task<string> GetTokenForUserAsync() | |
{ | |
AuthenticationResult authResult; | |
try | |
{ | |
authResult = await IdentityClientApp.AcquireTokenSilentAsync(Scopes, IdentityClientApp.Users.First()); | |
TokenForUser = authResult.AccessToken; | |
} | |
catch (Exception) | |
{ | |
if (TokenForUser == null || Expiration <= DateTimeOffset.UtcNow.AddMinutes(5)) | |
{ | |
authResult = await IdentityClientApp.AcquireTokenAsync(Scopes); | |
TokenForUser = authResult.AccessToken; | |
Expiration = authResult.ExpiresOn; | |
} | |
} | |
return TokenForUser; | |
} | |
/// <summary> | |
/// Signs the user out of the service. | |
/// </summary> | |
public static void SignOut() | |
{ | |
foreach (var user in IdentityClientApp.Users) | |
{ | |
IdentityClientApp.Remove(user); | |
} | |
graphClient = null; | |
TokenForUser = null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment