/// <summary> /// <para> /// Registers or logs in a user if their Id can be found. /// </para> /// </summary> /// <param name="context"></param> /// <param name="Redis"></param> /// <param name="Settings"></param> /// <returns></returns> internal static async Task RegisterUser(OAuthCreatingTicketContext context, Startup.Provider LoginProvider /* change this later */, IDatabase Redis, AppSetting Settings) { // Retrieve user info by passing an Authorization header with the value token {accesstoken}; var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint); request.Headers.Authorization = new AuthenticationHeaderValue(LoginProvider.AuthorizationHeader, context.AccessToken); // Extract the user info object from the OAuth response var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted); response.EnsureSuccessStatusCode(); var oauthres = await response.Content.ReadAsStringAsync(); if (Settings.Provider == "GitHub") { var GitHubProvider = new GitHubLoginProvider(Redis, Settings); // fetch the OAuth profile from the provider var user = await GitHubProvider.GetOAuthProfile(response, context); // Create the user from it var providerUser = GitHubProvider.CreateUserFromOAuth(user); // Register the profile var RegisteredUser = GitHubProvider.RegisterUser(providerUser); // Add the Name Identifier claim for htmlantiforgery tokens, and the users redis key location. context.Identity.AddClaims( new List <Claim> { new Claim( ClaimTypes.NameIdentifier, RegisteredUser.UserId.ToString(), ClaimValueTypes.String, context.Options.ClaimsIssuer ), new Claim( "RedisKey", $"{Settings.Redis.BaseKey}Users:{RegisteredUser.UserId}", ClaimValueTypes.String, context.Options.ClaimsIssuer ) } ); } else if (Settings.Provider == "Discord") { throw new NotImplementedException("Discord not really worth it"); var DiscordProvider = new DiscordLoginProvider(Redis, Settings); var a = await DiscordProvider.GetOAuthProfile(response, context); } }
/// <summary> /// Refreshes the PublicData hash in redis by making a request to the users GitHub UserProfile Api /// </summary> /// <param name="GitHubProfileUri"></param> /// <returns></returns> internal static async Task <PublicUser> RefreshPublicUserProfile(int GitHubProfileId, AppSetting Settings, IDatabase Redis) { var GitHubProvider = new GitHubLoginProvider(Redis, Settings); return(await GitHubProvider.UpdateProviderDetails(GitHubProfileId)); }