Skip to content

Commit ac312b4

Browse files
committed
feat: 로그인 샐패 로직 통잃화
로그인 실패도 글로벌 헨들러에서 처리
1 parent 1f79237 commit ac312b4

File tree

15 files changed

+514
-550
lines changed

15 files changed

+514
-550
lines changed
Lines changed: 34 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.AspNetCore.Mvc;
22
using ProjectVG.Application.Services.Auth;
3-
using ProjectVG.Application.Models.User;
3+
using ProjectVG.Common.Constants;
4+
using ProjectVG.Common.Exceptions;
45

56
namespace ProjectVG.Api.Controllers
67
{
@@ -15,150 +16,54 @@ public AuthController(IAuthService authService)
1516
_authService = authService;
1617
}
1718

18-
[HttpPost("test-login")]
19-
public async Task<IActionResult> TestLogin([FromBody] TestLoginRequest request)
20-
{
21-
try
22-
{
23-
var result = await _authService.LoginWithOAuthAsync("test", request.UserId.ToString());
24-
25-
if (result.IsSuccess)
26-
{
27-
return Ok(new
28-
{
29-
success = true,
30-
tokens = result.Tokens,
31-
user = result.User
32-
});
33-
}
34-
35-
return BadRequest(new
36-
{
37-
success = false,
38-
message = result.ErrorMessage
39-
});
40-
}
41-
catch (Exception ex)
42-
{
43-
return StatusCode(500, new
44-
{
45-
success = false,
46-
message = "Internal server error",
47-
error = ex.Message
48-
});
49-
}
50-
}
51-
5219
[HttpPost("refresh")]
53-
public async Task<IActionResult> RefreshToken([FromBody] RefreshTokenRequest request)
20+
public async Task<IActionResult> RefreshToken()
5421
{
55-
try
22+
var refreshToken = GetRefreshTokenFromHeader();
23+
var result = await _authService.RefreshTokenAsync(refreshToken);
24+
25+
return Ok(new
5626
{
57-
var result = await _authService.RefreshTokenAsync(request.RefreshToken);
58-
59-
if (result.IsSuccess)
60-
{
61-
return Ok(new
62-
{
63-
success = true,
64-
tokens = result.Tokens,
65-
user = result.User
66-
});
67-
}
68-
69-
return BadRequest(new
70-
{
71-
success = false,
72-
message = result.ErrorMessage
73-
});
74-
}
75-
catch (Exception ex)
76-
{
77-
return StatusCode(500, new
78-
{
79-
success = false,
80-
message = "Internal server error",
81-
error = ex.Message
82-
});
83-
}
27+
success = true,
28+
tokens = result.Tokens,
29+
user = result.User
30+
});
8431
}
8532

8633
[HttpPost("logout")]
87-
public async Task<IActionResult> Logout([FromBody] LogoutRequest request)
34+
public async Task<IActionResult> Logout()
8835
{
89-
try
36+
var refreshToken = GetRefreshTokenFromHeader();
37+
var success = await _authService.LogoutAsync(refreshToken);
38+
39+
return Ok(new
9040
{
91-
var success = await _authService.LogoutAsync(request.RefreshToken);
92-
93-
return Ok(new
94-
{
95-
success = success,
96-
message = success ? "Logout successful" : "Logout failed"
97-
});
98-
}
99-
catch (Exception ex)
100-
{
101-
return StatusCode(500, new
102-
{
103-
success = false,
104-
message = "Internal server error",
105-
error = ex.Message
106-
});
107-
}
41+
success = success,
42+
message = success ? "Logout successful" : "Logout failed"
43+
});
10844
}
10945

11046
[HttpPost("guest-login")]
111-
public async Task<IActionResult> GuestLogin([FromBody] GuestLoginRequest request)
47+
public async Task<IActionResult> GuestLogin([FromBody] string guestId)
11248
{
113-
try
49+
if (string.IsNullOrEmpty(guestId))
11450
{
115-
var result = await _authService.LoginWithOAuthAsync("guest", request.GuestId);
116-
117-
if (result.IsSuccess)
118-
{
119-
return Ok(new
120-
{
121-
success = true,
122-
tokens = result.Tokens,
123-
user = result.User
124-
});
125-
}
126-
127-
return BadRequest(new
128-
{
129-
success = false,
130-
message = result.ErrorMessage
131-
});
51+
throw new ValidationException(ErrorCode.GUEST_ID_INVALID);
13252
}
133-
catch (Exception ex)
53+
54+
var result = await _authService.LoginWithOAuthAsync("guest", guestId);
55+
56+
return Ok(new
13457
{
135-
return StatusCode(500, new
136-
{
137-
success = false,
138-
message = "Internal server error",
139-
error = ex.Message
140-
});
141-
}
58+
success = true,
59+
tokens = result.Tokens,
60+
user = result.User
61+
});
14262
}
143-
}
144-
145-
public class TestLoginRequest
146-
{
147-
public Guid UserId { get; set; }
148-
}
14963

150-
public class RefreshTokenRequest
151-
{
152-
public string RefreshToken { get; set; } = string.Empty;
153-
}
154-
155-
public class LogoutRequest
156-
{
157-
public string RefreshToken { get; set; } = string.Empty;
158-
}
159-
160-
public class GuestLoginRequest
161-
{
162-
public string GuestId { get; set; } = string.Empty;
64+
private string GetRefreshTokenFromHeader()
65+
{
66+
return Request.Headers["X-Refresh-Token"].FirstOrDefault() ?? string.Empty;
67+
}
16368
}
16469
}

ProjectVG.Api/Controllers/ChatController.cs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,34 +20,26 @@ public ChatController(IChatService chatService)
2020
_chatService = chatService;
2121
}
2222

23+
[HttpPost("process")]
2324
[JwtAuthentication]
24-
[HttpPost]
2525
public async Task<IActionResult> ProcessChat([FromBody] ChatRequest request)
2626
{
2727
var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
2828
if (string.IsNullOrEmpty(userId) || !Guid.TryParse(userId, out var userGuid))
2929
{
30-
return Unauthorized(new { success = false, message = "Invalid user information from token" });
30+
throw new ValidationException(ErrorCode.AUTHENTICATION_FAILED);
3131
}
32-
33-
ProcessChatCommand command = new() {
32+
33+
var command = new ProcessChatCommand
34+
{
3435
UserId = userGuid,
35-
CharacterId = request.CharacterId,
3636
Message = request.Message,
37-
SessionId = request.SessionId,
37+
CharacterId = request.CharacterId
3838
};
3939

40-
var requestResponse = await _chatService.EnqueueChatRequestAsync(command);
41-
42-
return Ok(new {
43-
success = true,
44-
status = requestResponse.Status,
45-
message = requestResponse.Message,
46-
sessionId = requestResponse.SessionId,
47-
userId = requestResponse.UserId,
48-
characterId = requestResponse.CharacterId,
49-
requestedAt = requestResponse.RequestedAt
50-
});
40+
var result = await _chatService.EnqueueChatRequestAsync(command);
41+
42+
return Ok(result);
5143
}
5244
}
5345
}

ProjectVG.Api/Controllers/OAuthController.cs

Lines changed: 26 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using Microsoft.AspNetCore.Mvc;
22
using ProjectVG.Application.Services.Auth;
3-
using ProjectVG.Infrastructure.Auth;
43
using Microsoft.Extensions.Options;
54
using ProjectVG.Common.Configuration;
65

@@ -27,29 +26,16 @@ public async Task<IActionResult> OAuth2Authorize(
2726
[FromQuery] string code_verifier,
2827
[FromQuery] string client_redirect_uri)
2928
{
30-
try
31-
{
32-
if (string.IsNullOrEmpty(code_challenge) || code_challenge_method != "S256")
33-
{
34-
return BadRequest("Invalid PKCE parameters");
35-
}
36-
37-
var googleAuthUrl = await _oauth2Service.BuildAuthorizationUrlAsync(state, code_challenge, code_challenge_method, code_verifier, client_redirect_uri);
38-
39-
return Ok(new
40-
{
41-
success = true,
42-
auth_url = googleAuthUrl
43-
});
44-
}
45-
catch (InvalidOperationException ex)
46-
{
47-
return BadRequest(ex.Message);
48-
}
49-
catch (Exception ex)
50-
{
51-
return BadRequest("OAuth2 authorization failed");
29+
if (string.IsNullOrEmpty(code_challenge) || code_challenge_method != "S256") {
30+
throw new ValidationException(ErrorCode.OAUTH2_PKCE_INVALID);
5231
}
32+
33+
var googleAuthUrl = await _oauth2Service.BuildAuthorizationUrlAsync(state, code_challenge, code_challenge_method, code_verifier, client_redirect_uri);
34+
35+
return Ok(new {
36+
success = true,
37+
auth_url = googleAuthUrl
38+
});
5339
}
5440

5541
[HttpGet("oauth2/callback")]
@@ -59,60 +45,39 @@ public async Task<IActionResult> OAuth2Callback(
5945
[FromQuery] string state,
6046
[FromQuery] string error = null)
6147
{
62-
if (!string.IsNullOrEmpty(error))
63-
{
64-
return BadRequest(new { success = false, message = $"OAuth2 error: {error}" });
48+
if (!string.IsNullOrEmpty(error)) {
49+
throw new ValidationException(ErrorCode.OAUTH2_CALLBACK_FAILED);
6550
}
6651

67-
if (string.IsNullOrEmpty(code) || string.IsNullOrEmpty(state))
68-
{
69-
return BadRequest(new { success = false, message = "Missing required parameters: code or state" });
52+
if (string.IsNullOrEmpty(code) || string.IsNullOrEmpty(state)) {
53+
throw new ValidationException(ErrorCode.REQUIRED_PARAMETER_MISSING);
7054
}
7155

7256
var result = await _oauth2Service.HandleOAuth2CallbackAsync(code, state);
73-
74-
if (!result.Success)
75-
{
76-
return BadRequest(new { success = false, message = result.Message });
77-
}
7857

7958
return Redirect(result.RedirectUrl!);
8059
}
8160

8261
[HttpGet("oauth2/token")]
8362
public async Task<IActionResult> GetOAuth2Token([FromQuery] string state)
8463
{
85-
try
86-
{
87-
if (string.IsNullOrEmpty(state))
88-
{
89-
return BadRequest(new { success = false, message = "State parameter is required" });
90-
}
91-
92-
var tokenData = await _oauth2Service.GetTokenDataAsync(state);
93-
if (tokenData == null)
94-
{
95-
return BadRequest(new { success = false, message = "Invalid or expired token request" });
96-
}
64+
if (string.IsNullOrEmpty(state)) {
65+
throw new ValidationException(ErrorCode.REQUIRED_PARAMETER_MISSING);
66+
}
9767

98-
await _oauth2Service.DeleteTokenDataAsync(state);
68+
var tokenData = await _oauth2Service.GetTokenDataAsync(state);
69+
if (tokenData == null) {
70+
throw new ValidationException(ErrorCode.OAUTH2_REQUEST_NOT_FOUND);
71+
}
9972

100-
Console.WriteLine($"[OAuth2 Token] User UID: {tokenData.UID}");
101-
Console.WriteLine($"[OAuth2 Token] Access Token: {tokenData.AccessToken[..Math.Min(20, tokenData.AccessToken.Length)]}...");
102-
Console.WriteLine($"[OAuth2 Token] Refresh Token: {tokenData.RefreshToken[..Math.Min(20, tokenData.RefreshToken.Length)]}...");
103-
Console.WriteLine($"[OAuth2 Token] Expires In: {tokenData.ExpiresIn} seconds");
73+
await _oauth2Service.DeleteTokenDataAsync(state);
10474

105-
Response.Headers.Append("X-Access-Token", tokenData.AccessToken);
106-
Response.Headers.Append("X-Refresh-Token", tokenData.RefreshToken);
107-
Response.Headers.Append("X-Expires-In", tokenData.ExpiresIn.ToString());
108-
Response.Headers.Append("X-UID", tokenData.UID);
75+
Response.Headers.Append("X-Access-Token", tokenData.AccessToken);
76+
Response.Headers.Append("X-Refresh-Token", tokenData.RefreshToken);
77+
Response.Headers.Append("X-Expires-In", tokenData.ExpiresIn.ToString());
78+
Response.Headers.Append("X-UID", tokenData.UID);
10979

110-
return Ok(new { success = true });
111-
}
112-
catch (Exception ex)
113-
{
114-
return BadRequest(new { success = false, message = ex.Message });
115-
}
80+
return Ok(new { success = true });
11681
}
11782

11883
}

ProjectVG.Application/Models/Auth/OAuth2Models.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public class OAuth2TokenData
5252
public string RefreshToken { get; set; } = string.Empty;
5353
public int ExpiresIn { get; set; }
5454
public string UID { get; set; } = string.Empty;
55-
public DateTime CreatedAt { get; set; }
5655
}
5756

5857
public class OAuth2CallbackResult

0 commit comments

Comments
 (0)