From ac987781fab639fe40dce79576807cf606791e14 Mon Sep 17 00:00:00 2001 From: Sergey Karmanov Date: Sun, 24 Dec 2023 04:58:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20Go?= =?UTF-8?q?ogle=20auth?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CyberBoom/Controllers/UserController.cs | 70 +++++++++++++++++++++++++ CyberBoom/Program.cs | 10 +++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/CyberBoom/Controllers/UserController.cs b/CyberBoom/Controllers/UserController.cs index 3512392..771cd20 100644 --- a/CyberBoom/Controllers/UserController.cs +++ b/CyberBoom/Controllers/UserController.cs @@ -1,6 +1,9 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; +using System.Security.Cryptography; +using System.Text; using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.Google; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; @@ -141,6 +144,73 @@ public class UsersController : ControllerBase return Ok(new { userWr.Id, Token = token }); } + [AllowAnonymous] + [HttpGet("signin-google")] + public IActionResult SignInWithGoogle() + { + var properties = new AuthenticationProperties { RedirectUri = Url.Action("SignInWithGoogleCallback") }; + return Challenge(properties, GoogleDefaults.AuthenticationScheme); + } + + [AllowAnonymous] + [HttpGet("signin-google-callback")] + public async Task SignInWithGoogleCallback() + { + var result = await HttpContext.AuthenticateAsync(GoogleDefaults.AuthenticationScheme); + + if (result?.Succeeded != true) + { + return BadRequest("Ошибка аутентификации Google"); + } + + // Извлеките информацию о пользователе из результата аутентификации + var claims = result.Principal!.Identities + .FirstOrDefault(y => y.AuthenticationType == GoogleDefaults.AuthenticationScheme)? + .Claims; + + + var email = claims?.FirstOrDefault(x => x.Type == ClaimTypes.Email)!.Value; + var name = claims?.FirstOrDefault(x => x.Type == ClaimTypes.Name)!.Value; + + var user = await _userManager.FindByEmailAsync(email!); + var role = "спикер"; + if(user is null) + { + user = new User + { + Fio = name!, + Specialities = string.Empty, + TelegramBotUrl = string.Empty, + AvatarUrl = $"https://www.gravatar.com/avatar/{BitConverter.ToString(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(email!))).Replace("-", "").ToLowerInvariant()}?d=identicon", + UserName = name, + Email = email + }; + var createResult = await _userManager.CreateAsync(user); + + if (!createResult.Succeeded) + return BadRequest(createResult.Errors); + + + + + + await AddUerToRole(user, role); + } + + + var token = GetToken(user, role); + + + + // Здесь вы можете создать JWT или другой токен для аутентификации в вашем приложении + // и отправить его пользователю. + + return Ok(new { + Token = token, + User = user + }); + } + [Authorize] [HttpGet] public async Task GetUserData(string id) diff --git a/CyberBoom/Program.cs b/CyberBoom/Program.cs index 6ad0586..2751d19 100644 --- a/CyberBoom/Program.cs +++ b/CyberBoom/Program.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.FileProviders; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.Authorization; using Microsoft.OpenApi.Models; +using Microsoft.AspNetCore.Authentication.Google; TypeAdapterConfig.NewConfig().Map(d => d.SpeackerImage, s => s.SpeackerImage.JoinFileNames()); @@ -34,14 +35,19 @@ builder.Services.AddIdentity() builder.Services.AddAuthentication(opt => { opt.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - opt.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + opt.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { var bearerOptions = new BearerAccessTokenOptions(); options.RequireHttpsMetadata = bearerOptions.RequiredHttpsMetadata; options.TokenValidationParameters = bearerOptions.TokenValidationParameters; -}); +}) +.AddGoogle(options => +{ + options.ClientId = builder.Configuration["Google:ClientId"]!; + options.ClientSecret = builder.Configuration["Google:ClientSecret"]!; +});;