수신자 이름 지정 인증번호 발송 기능 추가:
- %USER_NAME% 지원 위한 createMessageRecipient 수정 - GUEST_USER_NAME 상수 및 관련 기본값 처리 로직 추가
This commit is contained in:
@@ -4,11 +4,23 @@ public interface AuthNumberService {
|
|||||||
|
|
||||||
String sendRequestAuthNumber(String recipientKey, String msgType);
|
String sendRequestAuthNumber(String recipientKey, String msgType);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기본 TTL 로 발송하되 수신자 이름을 지정한다. 세 번째 인자가 int 인 오버로드(TTL 지정)와 혼동하지 말 것.
|
||||||
|
*/
|
||||||
|
String sendRequestAuthNumber(String recipientKey, String msgType, String username);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 인증번호를 지정한 유효시간(초)으로 발송한다. 로그인/step-up 2FA 는 회원가입 기본 TTL 과
|
* 인증번호를 지정한 유효시간(초)으로 발송한다. 로그인/step-up 2FA 는 회원가입 기본 TTL 과
|
||||||
* 다른 값을 쓸 수 있으므로 호출부에서 TTL 을 지정한다.
|
* 다른 값을 쓸 수 있으므로 호출부에서 TTL 을 지정한다.
|
||||||
*/
|
*/
|
||||||
String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds);
|
String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 수신자 이름을 지정해 인증번호를 발송한다. 메시지 템플릿의 %USER_NAME% 치환에 사용되며,
|
||||||
|
* 회원가입·아이디/비밀번호 찾기처럼 사용자 이름을 알 수 없는 흐름은 "guest" 를 넘긴다.
|
||||||
|
* username 이 비어 있으면 %USER_NAME% 은 치환되지 않고 원문이 그대로 남는다.
|
||||||
|
*/
|
||||||
|
String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds, String username);
|
||||||
|
|
||||||
boolean verifyAuthNumber(String recipientKey, String authNumber);
|
boolean verifyAuthNumber(String recipientKey, String authNumber);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,19 +45,31 @@ public class AuthNumberServiceImpl implements AuthNumberService {
|
|||||||
@Override
|
@Override
|
||||||
@Transactional(noRollbackFor = AuthNumberException.class)
|
@Transactional(noRollbackFor = AuthNumberException.class)
|
||||||
public String sendRequestAuthNumber(String recipientKey, String msgType) {
|
public String sendRequestAuthNumber(String recipientKey, String msgType) {
|
||||||
return sendRequestAuthNumber(recipientKey, msgType, authNumberExpirationTime);
|
return sendRequestAuthNumber(recipientKey, msgType, authNumberExpirationTime, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(noRollbackFor = AuthNumberException.class)
|
||||||
|
public String sendRequestAuthNumber(String recipientKey, String msgType, String username) {
|
||||||
|
return sendRequestAuthNumber(recipientKey, msgType, authNumberExpirationTime, username);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional(noRollbackFor = AuthNumberException.class)
|
@Transactional(noRollbackFor = AuthNumberException.class)
|
||||||
public String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds) {
|
public String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds) {
|
||||||
|
return sendRequestAuthNumber(recipientKey, msgType, ttlSeconds, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(noRollbackFor = AuthNumberException.class)
|
||||||
|
public String sendRequestAuthNumber(String recipientKey, String msgType, int ttlSeconds, String username) {
|
||||||
logger.info("Sending auth number to: {} via {} (ttl={}s)", recipientKey, msgType, ttlSeconds);
|
logger.info("Sending auth number to: {} via {} (ttl={}s)", recipientKey, msgType, ttlSeconds);
|
||||||
|
|
||||||
validateResendTime(recipientKey);
|
validateResendTime(recipientKey);
|
||||||
|
|
||||||
String authNumber = generator.generateAuthNumber();
|
String authNumber = generator.generateAuthNumber();
|
||||||
|
|
||||||
MessageRecipient recipient = createMessageRecipient(recipientKey, msgType);
|
MessageRecipient recipient = createMessageRecipient(recipientKey, msgType, username);
|
||||||
messageSender.sendAuthMessage(recipient, authNumber, msgType);
|
messageSender.sendAuthMessage(recipient, authNumber, msgType);
|
||||||
|
|
||||||
storage.saveAuthNumber(recipientKey, authNumber,
|
storage.saveAuthNumber(recipientKey, authNumber,
|
||||||
@@ -99,9 +111,13 @@ public class AuthNumberServiceImpl implements AuthNumberService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private MessageRecipient createMessageRecipient(String recipientKey, String msgType) {
|
private MessageRecipient createMessageRecipient(String recipientKey, String msgType, String username) {
|
||||||
MessageRecipient recipient = new MessageRecipient();
|
MessageRecipient recipient = new MessageRecipient();
|
||||||
recipient.setUserId(recipientKey);
|
recipient.setUserId(recipientKey);
|
||||||
|
// 메시지 템플릿 %USER_NAME% 치환용. 비어 있으면 MessageSendService 가 파라미터 자체를 넣지 않는다.
|
||||||
|
if (username != null && !username.trim().isEmpty()) {
|
||||||
|
recipient.setUsername(username);
|
||||||
|
}
|
||||||
if ("SMS".equalsIgnoreCase(msgType)) {
|
if ("SMS".equalsIgnoreCase(msgType)) {
|
||||||
recipient.setPhone(recipientKey);
|
recipient.setPhone(recipientKey);
|
||||||
} else if ("EMAIL".equalsIgnoreCase(msgType)) {
|
} else if ("EMAIL".equalsIgnoreCase(msgType)) {
|
||||||
|
|||||||
@@ -17,6 +17,12 @@ public class AuthFacadeImpl implements AuthFacade {
|
|||||||
private final AuthNoticeProperties authNoticeProperties;
|
private final AuthNoticeProperties authNoticeProperties;
|
||||||
private static final Logger log = LoggerFactory.getLogger(AuthFacadeImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(AuthFacadeImpl.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 회원가입·아이디/비밀번호 찾기 등 로그인 이전 흐름은 수신자 이름을 알 수 없으므로
|
||||||
|
* 메시지 템플릿 %USER_NAME% 자리에 넣을 기본값.
|
||||||
|
*/
|
||||||
|
private static final String GUEST_USER_NAME = "guest";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 인증 요청
|
* 인증 요청
|
||||||
@@ -43,7 +49,7 @@ public class AuthFacadeImpl implements AuthFacade {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String generatedAuthNumber = authNumberService.sendRequestAuthNumber(recipientKey, msgType);
|
String generatedAuthNumber = authNumberService.sendRequestAuthNumber(recipientKey, msgType, GUEST_USER_NAME);
|
||||||
response.setValid(true);
|
response.setValid(true);
|
||||||
response.setMessage("인증번호를 발송하였습니다.");
|
response.setMessage("인증번호를 발송하였습니다.");
|
||||||
// 테스트 환경(PTL_PROPERTY auth.test-notice.enabled=true, prod 제외)에서만 인증번호를 응답에 노출
|
// 테스트 환경(PTL_PROPERTY auth.test-notice.enabled=true, prod 제외)에서만 인증번호를 응답에 노출
|
||||||
|
|||||||
Reference in New Issue
Block a user