(테스트) 최초 로그인 시 패스워드 변경 기능 추가

This commit is contained in:
yh.kim 2026-03-24 14:49:03 +09:00
parent c5e7193959
commit c1298c22c1
1 changed files with 60 additions and 24 deletions

View File

@ -20,6 +20,7 @@ type
EditID, EditPW: TEdit;
ButtonLogin: TButton;
procedure FormCreate(Sender: TObject);
procedure FromClose(Sender: TObject; var Action: TCloseAction);
procedure ButtonLoginClick(Sender: TObject);
private
@ -47,6 +48,12 @@ begin
Self.FormStyle := fsStayOnTop;
end;
procedure TAuthForm.FromClose(Sender: TObject; var Action: TCloseAction);
begin
// 폼이 닫힐 때 메모리에서 자동으로 제거되도록 설정
Action := caFree;
end;
function IsValidInput(const AText: string): Boolean;
const
// 영문, 숫자, 특수문자만 허용
@ -98,10 +105,13 @@ begin
Guard(ss, TStringStream.Create(sData, TEncoding.UTF8));
Result := HTTP.Post(sDestIPort + sUrl, ss);
except
on E: EIdHTTPProtocolException do
begin
Result := E.ErrorMessage;
end;
on E: Exception do
begin
//ShowMessage('HTTP 통신 내부 오류: ' + E.Message);
Result := '';
Result := 'Error: ' + E.Message;
end;
end;
end;
@ -121,7 +131,7 @@ begin
// 차단 시작 시간으로부터 5분이 지났는지 확인
if (CurrentTime - BlockStartTime) < (5 / (24 * 60)) then
begin
MessageBox(0,'로그인 5회 실패로 인해 5분간 로그인이 차단됩니다', 'BSOne Login', MB_ICONINFORMATION);
MessageBox(0,'로그인 5회 실패로 인해 5분간 로그인이 차단됩니다', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
Exit;
end
else
@ -133,27 +143,27 @@ begin
if EditID.Text = '' then
begin
MessageBox(0,'ID를 입력하세요', 'BSOne Login', MB_ICONINFORMATION);
MessageBox(0,'ID를 입력하세요', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
EditID.SetFocus;
Exit;
end;
if not IsValidInput(EditID.Text) then
begin
MessageBox(0,'ID에는 영문, 숫자, 특수기호를 제외하고 들어갈 수 없습니다', 'BSOne Login', MB_ICONINFORMATION);
MessageBox(0,'ID에는 영문, 숫자, 특수기호를 제외하고 들어갈 수 없습니다', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
Exit;
end;
if EditPW.Text = '' then
begin
MessageBox(0,'패스워드를 입력하세요', 'BSOne Login', MB_ICONINFORMATION);
MessageBox(0,'패스워드를 입력하세요', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
EditPW.SetFocus;
Exit;
end;
if not IsValidInput(EditPW.Text) then
begin
MessageBox(0,'패스워드에는 영문, 숫자, 특수기호를 제외하고 들어갈 수 없습니다', 'BSOne Login', MB_ICONINFORMATION);
MessageBox(0,'패스워드에는 영문, 숫자, 특수기호를 제외하고 들어갈 수 없습니다', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
Exit;
end;
@ -167,12 +177,50 @@ begin
O.S['agentId'] := sAgentId;
sResult := GetPostData(sDestIPort, 'aapi/auth/refresh-token/issue', O.AsJSon);
//showmessage(sResult);
if sResult <> '' then
begin
if sResult.Contains('error') then
// 일반 예외(Exception)
if sResult.Contains('Error') then
begin
//_Trace('Error .. GetRegPerInfoUrl() .. Msg="%s"', [Result]);
ShowMessage('에러 1: '+ sResult);
//_Trace('Error .. GetPostData() .. Msg="%s"', [Result]);
MessageBox(0, LPCWSTR(sResult), 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
exit;
end
// 프로토콜 예외(EIdHTTPProtocolException)
else if sResult.Contains('err') then
begin
O := SO(sResult);
sResult := O.S['err'];
MessageBox(0, LPCWSTR('Error: ' + sResult), 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
Inc(iFailCount);
if iFailCount >= 5 then
begin
BlockStartTime := Now; // 현재 시간 기록
MessageBox(0, '인증 실패 5회 연속으로 5분간 로그인이 차단됩니다.', 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
exit;
end
else
begin
MessageBox(0, PChar(format('아이디 또는 비밀번호가 일치하지 않습니다' + sLineBreak +
'(현재 %d회 실패 / 5회 연속실패 시 차단)', [iFailCount])), 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
end;
exit;
end
else if sResult.Contains('passwordChange') then
begin
O := SO(sResult);
sResult := O.S['passwordChangeRequired'];
if sResult = 'true' then
begin
var sUrl := O.S['passwordChangeUrl'];
showmessage(sUrl);
sResult := GetPostData(sDestIPort, sUrl, O.AsJSon);
end;
MessageBox(0, LPCWSTR(sResult), 'BSOne Login', MB_ICONINFORMATION or MB_TOPMOST or MB_SETFOREGROUND);
exit;
end
else
@ -185,24 +233,12 @@ begin
end
else
begin
Inc(iFailCount);
if iFailCount >= 5 then
begin
BlockStartTime := Now; // 현재 시간 기록
ShowMessage('인증 실패 5회 연속으로 5분간 로그인이 차단됩니다.');
exit;
end
else
begin
ShowMessage(Format('아이디 또는 비밀번호가 일치하지 않습니다. (현재 %d회 실패 / 5회 연속실패 시 차단)', [iFailCount]));
end;
exit;
end;
except
on E: Exception do
begin
ShowMessage('오류 발생: Fail .. GetRegPerInfoUrl()' + sLineBreak + E.Message);
ShowMessage('오류 발생: Fail .. GetPostData()' + sLineBreak + E.Message);
exit;
end;
end;
@ -240,7 +276,7 @@ begin
if Assigned(FOnSuccess) then
FOnSuccess(Self, CODE_AUTH_OK); // 메인 서비스에 알림 발송
Close; // 창 닫기
Close;
end;
end.