forked from AcaMate/AcaMate_API
Merge pull request '프론트 테스트 머지' (#2) from Academy into main
Reviewed-on: https://git.ipstein.myds.me/seonkyu.kim/AcaMate_API/pulls/2
This commit is contained in:
commit
28ad68bfe6
72
.gitignore
vendored
72
.gitignore
vendored
|
@ -11,7 +11,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 기본 파일 및 폴더 제외
|
# 기본 파일 및 폴더 제외
|
||||||
*.log
|
*.log
|
||||||
*.env
|
*.env
|
||||||
|
@ -55,6 +54,11 @@ obj/
|
||||||
|
|
||||||
# Blazor 관련
|
# Blazor 관련
|
||||||
**/wwwroot/_framework/
|
**/wwwroot/_framework/
|
||||||
|
./wwwroot
|
||||||
|
**/wwwroot
|
||||||
|
**/publish
|
||||||
|
./publish
|
||||||
|
|
||||||
|
|
||||||
# Docker 관련
|
# Docker 관련
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
@ -62,4 +66,68 @@ Dockerfile
|
||||||
|
|
||||||
# 기타 캐시 파일
|
# 기타 캐시 파일
|
||||||
**/*.cache
|
**/*.cache
|
||||||
**/*.tmp
|
**/*.tmp# 특정 환경에 따라 추가
|
||||||
|
/private/
|
||||||
|
/publish/
|
||||||
|
/bin/
|
||||||
|
/obj/
|
||||||
|
|
||||||
|
./private/
|
||||||
|
./privacy/
|
||||||
|
./publish/
|
||||||
|
./bin/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 기본 파일 및 폴더 제외
|
||||||
|
*.log
|
||||||
|
*.env
|
||||||
|
*.bak
|
||||||
|
*.tmp
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# macOS 관련 파일 제외
|
||||||
|
._
|
||||||
|
._*
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
|
||||||
|
# Windows 관련
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
desktop.ini
|
||||||
|
|
||||||
|
# Visual Studio 관련
|
||||||
|
.vscode/
|
||||||
|
.vs/
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Rider 관련
|
||||||
|
.idea/
|
||||||
|
*.sln.iml
|
||||||
|
|
||||||
|
# .NET 관련
|
||||||
|
bin/
|
||||||
|
obj/
|
||||||
|
*.pdb
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.nuget/
|
||||||
|
|
||||||
|
# Blazor 관련
|
||||||
|
**/wwwroot/_framework/
|
||||||
|
|
||||||
|
# Docker 관련
|
||||||
|
docker-compose.override.yml
|
||||||
|
Dockerfile
|
||||||
|
|
||||||
|
# 기타 캐시 파일
|
||||||
|
**/*.cache
|
||||||
|
**/*.tmp
|
22
Program.cs
22
Program.cs
|
@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
using Microsoft.Extensions.FileProviders;
|
||||||
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
@ -23,6 +24,7 @@ using Back.Program.Services.V1;
|
||||||
using Back.Program.Services.V1.Interfaces;
|
using Back.Program.Services.V1.Interfaces;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
|
|
||||||
|
@ -174,6 +176,7 @@ else
|
||||||
///// ===== builder 설정 부 ===== /////
|
///// ===== builder 설정 부 ===== /////
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
string staticRoot;
|
||||||
|
|
||||||
if (app.Environment.IsDevelopment())
|
if (app.Environment.IsDevelopment())
|
||||||
{
|
{
|
||||||
|
@ -181,11 +184,13 @@ if (app.Environment.IsDevelopment())
|
||||||
// app.UseSwaggerUI();
|
// app.UseSwaggerUI();
|
||||||
app.UseCustomSwaggerUI();
|
app.UseCustomSwaggerUI();
|
||||||
app.UseDeveloperExceptionPage(); // 좀더 자세한 예외 정보 제공
|
app.UseDeveloperExceptionPage(); // 좀더 자세한 예외 정보 제공
|
||||||
|
staticRoot = Path.Combine(Directory.GetCurrentDirectory(), "publish", "debug", "wwwroot");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
app.UseExceptionHandler("/error");
|
app.UseExceptionHandler("/error");
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
|
staticRoot = Path.Combine(Directory.GetCurrentDirectory(), "publish", "release", "wwwroot");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 로컬 테스트 위한 부분 (올릴떄는 켜두기)
|
// 로컬 테스트 위한 부분 (올릴떄는 켜두기)
|
||||||
|
@ -198,14 +203,31 @@ app.UseMiddleware<APIHeaderMiddleware>(
|
||||||
(object)new string[] { "iOS_AM_Connect_Key", "And_AM_Connect_Key", "Web_AM_Connect_Key" }
|
(object)new string[] { "iOS_AM_Connect_Key", "And_AM_Connect_Key", "Web_AM_Connect_Key" }
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// app.UseBlazorFrameworkFiles();
|
||||||
|
// app.UseStaticFiles();
|
||||||
|
|
||||||
|
app.UseStaticFiles(new StaticFileOptions
|
||||||
|
{
|
||||||
|
FileProvider = new PhysicalFileProvider(staticRoot),
|
||||||
|
RequestPath = ""
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
app.UseRouting();
|
app.UseRouting();
|
||||||
app.UseCors("CorsPolicy");
|
app.UseCors("CorsPolicy");
|
||||||
app.UseAuthorization();
|
app.UseAuthorization();
|
||||||
|
|
||||||
app.UseWebSockets();
|
app.UseWebSockets();
|
||||||
|
|
||||||
app.UseEndpoints(end =>
|
app.UseEndpoints(end =>
|
||||||
{
|
{
|
||||||
ControllerEndpointRouteBuilderExtensions.MapControllers(end);
|
ControllerEndpointRouteBuilderExtensions.MapControllers(end);
|
||||||
|
|
||||||
|
// 프론트 테스트 위한 부분
|
||||||
|
end.MapFallbackToFile("index.html");
|
||||||
|
|
||||||
end.MapHub<ChatHub>("/chatHub");
|
end.MapHub<ChatHub>("/chatHub");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,11 @@ namespace Back.Program.Common.Auth
|
||||||
///
|
///
|
||||||
public class APIHeaderMiddleware
|
public class APIHeaderMiddleware
|
||||||
{
|
{
|
||||||
|
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
private readonly string[] _headerNames;
|
private readonly string[] _headerNames;
|
||||||
// private readonly IHeaderConfig _headerConfig;
|
// private readonly IHeaderConfig _headerConfig;
|
||||||
|
|
||||||
public APIHeaderMiddleware(RequestDelegate next, string[] headerNames)//, IHeaderConfig headerConfig)
|
public APIHeaderMiddleware(RequestDelegate next, string[] headerNames) //, IHeaderConfig headerConfig)
|
||||||
{
|
{
|
||||||
_next = next;
|
_next = next;
|
||||||
_headerNames = headerNames;
|
_headerNames = headerNames;
|
||||||
|
@ -26,35 +25,45 @@ namespace Back.Program.Common.Auth
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scoped 사용해서 값 가져오는 곳임
|
// 정적 파일 요청은 미들웨어 건너뜀
|
||||||
var headerConfig = context.RequestServices.GetRequiredService<IHeaderConfig>();
|
var path = context.Request.Path.Value;
|
||||||
|
if (path != null && (path.StartsWith("/api")))
|
||||||
bool valid = false;
|
|
||||||
|
|
||||||
foreach (var header in _headerNames)
|
|
||||||
{
|
{
|
||||||
/// context.Request.Headers.TryGetValue(header, out var headerValue)
|
// Scoped 사용해서 값 가져오는 곳임
|
||||||
/// header 를 찾는데 header
|
var headerConfig = context.RequestServices.GetRequiredService<IHeaderConfig>();
|
||||||
if (context.Request.Headers.TryGetValue(header, out var headerValue) &&
|
|
||||||
!string.IsNullOrWhiteSpace(headerValue))
|
bool valid = false;
|
||||||
|
|
||||||
|
foreach (var header in _headerNames)
|
||||||
{
|
{
|
||||||
var keyName = await headerConfig.GetExpectedHeaderValueAsync(headerValue);
|
/// context.Request.Headers.TryGetValue(header, out var headerValue)
|
||||||
if (keyName != string.Empty)
|
/// header 를 찾는데 header
|
||||||
|
if (context.Request.Headers.TryGetValue(header, out var headerValue) &&
|
||||||
|
!string.IsNullOrWhiteSpace(headerValue))
|
||||||
{
|
{
|
||||||
valid = true;
|
var keyName = await headerConfig.GetExpectedHeaderValueAsync(headerValue);
|
||||||
break;
|
if (keyName != string.Empty)
|
||||||
|
{
|
||||||
|
valid = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!valid)
|
||||||
|
{
|
||||||
|
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
|
||||||
|
await context.Response.WriteAsync($"Invalid header value");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _next(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!valid)
|
|
||||||
{
|
{
|
||||||
context.Response.StatusCode = StatusCodes.Status401Unauthorized;
|
await _next(context);
|
||||||
await context.Response.WriteAsync($"Invalid header value");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
await _next(context);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,42 +1,57 @@
|
||||||
|
using Back.Program.Services.V1.Interfaces;
|
||||||
using Microsoft.AspNetCore.SignalR;
|
using Microsoft.AspNetCore.SignalR;
|
||||||
|
|
||||||
namespace Back.Program.Common.Chat
|
namespace Back.Program.Common.Chat;
|
||||||
|
|
||||||
|
public class ChatHub : Hub
|
||||||
{
|
{
|
||||||
public class ChatHub : Hub
|
private readonly ILogger<ChatHub> _logger;
|
||||||
|
private readonly IChatService _chatService;
|
||||||
|
|
||||||
|
public ChatHub(ILogger<ChatHub> logger, IChatService chatService)
|
||||||
{
|
{
|
||||||
// 클라이언트에서 메시지를 보내면 모든 사용자에게 전송
|
_logger = logger;
|
||||||
public async Task SendMessage(string user, string message)
|
_chatService = chatService;
|
||||||
{
|
}
|
||||||
Console.WriteLine($"Message received: {user}: {message}");
|
|
||||||
await Clients.All.SendAsync("ReceiveMessage", user, message);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// 특정 사용자에게 메시지를 보냄
|
// 클라이언트에서 메시지를 보내면 모든 사용자에게 전송
|
||||||
public async Task SendMessageToUser(string connectionId, string message)
|
public async Task SendMessage(string user, string message)
|
||||||
{
|
{
|
||||||
await Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
|
Console.WriteLine($"Message received: {user}: {message}");
|
||||||
}
|
await Clients.All.SendAsync("ReceiveMessage", user, message);
|
||||||
|
}
|
||||||
|
|
||||||
// 클라이언트가 연결될 때 호출
|
// 특정 사용자에게 메시지를 보냄
|
||||||
public override async Task OnConnectedAsync()
|
public async Task SendMessageToUser(string connectionId, string message)
|
||||||
{
|
{
|
||||||
await Clients.Caller.SendAsync("ReceiveMessage", "System", $"Welcome! Your ID: {Context.ConnectionId}");
|
await Clients.Client(connectionId).SendAsync("ReceiveMessage", message);
|
||||||
Console.WriteLine("OnConnectedAsync");
|
}
|
||||||
await base.OnConnectedAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 클라이언트가 연결 해제될 때 호출
|
// 클라이언트가 연결될 때 호출
|
||||||
public override async Task OnDisconnectedAsync(Exception? exception)
|
public override async Task OnConnectedAsync()
|
||||||
{
|
{
|
||||||
await Clients.All.SendAsync("ReceiveMessage", "System", $"{Context.ConnectionId} disconnected");
|
await Clients.Caller.SendAsync("ReceiveMessage", "System", $"Welcome! Your ID: {Context.ConnectionId}");
|
||||||
Console.WriteLine("OnDisconnectedAsync");
|
Console.WriteLine("OnConnectedAsync");
|
||||||
await base.OnDisconnectedAsync(exception);
|
await base.OnConnectedAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 클라이언트가 연결 해제될 때 호출
|
||||||
|
public override async Task OnDisconnectedAsync(Exception? exception)
|
||||||
|
{
|
||||||
|
await Clients.All.SendAsync("ReceiveMessage", "System", $"{Context.ConnectionId} disconnected");
|
||||||
|
Console.WriteLine("OnDisconnectedAsync");
|
||||||
|
await base.OnDisconnectedAsync(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task JoinRoom(string cid)
|
||||||
|
{
|
||||||
|
await Groups.AddToGroupAsync(Context.ConnectionId, cid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task JoinGroup(string cid, string groupName)
|
||||||
|
{
|
||||||
|
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
6
Program/Controllers/V1/ChatController.cs
Normal file
6
Program/Controllers/V1/ChatController.cs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Back.Program.Controllers.V1;
|
||||||
|
|
||||||
|
public class ChatController
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
8
Program/Services/V1/ChatService.cs
Normal file
8
Program/Services/V1/ChatService.cs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
using Back.Program.Services.V1.Interfaces;
|
||||||
|
|
||||||
|
namespace Back.Program.Services.V1;
|
||||||
|
|
||||||
|
public class ChatService: IChatService
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
6
Program/Services/V1/Interfaces/IChatService.cs
Normal file
6
Program/Services/V1/Interfaces/IChatService.cs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Back.Program.Services.V1.Interfaces;
|
||||||
|
|
||||||
|
public interface IChatService
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user