forked from baron/baron-sso
fix(auth): 비밀번호 재설정 리다이렉트 언어 보정 및 로그인 상태별 분기 차단
1. 백엔드 ProcessPasswordResetToken 리다이렉션 경로에 최우선 선호 로케일 주소(ko/en) 동적 생성 적용 (레이스 컨디션 방지 및 로딩 갇힘 해결) 2. ForgotPasswordScreen 발송 성공 후 빈 네비게이터 팝 현상 제거 (GoRouter context.pop() 및 context.go() 사용) 3. 로그인 후 화면(내정보 프로필 페이지)에서 불필요한 비밀번호 분실 버튼 제거 정책 반영
This commit is contained in:
@@ -4144,7 +4144,17 @@ func (h *AuthHandler) ProcessPasswordResetToken(c *fiber.Ctx) error {
|
|||||||
ale.LoginIDs["loginId_normalized"] = loginID
|
ale.LoginIDs["loginId_normalized"] = loginID
|
||||||
|
|
||||||
userfrontURL := h.resolveUserfrontURL(c)
|
userfrontURL := h.resolveUserfrontURL(c)
|
||||||
redirectBase, parseErr := url.Parse(userfrontURL + "/reset-password")
|
locale := "ko"
|
||||||
|
acceptLang := c.Get("Accept-Language")
|
||||||
|
if acceptLang != "" {
|
||||||
|
// Accept-Language 헤더는 선호도가 가장 높은 순서대로 쉼표로 구분되어 나열됩니다. (예: ko-KR,ko;q=0.9,en-US;q=0.8)
|
||||||
|
// 따라서 첫 번째 쉼표 이전의 가장 첫 번째 세그먼트가 사용자가 최우선으로 선호하는 언어입니다.
|
||||||
|
firstLang := strings.Split(acceptLang, ",")[0]
|
||||||
|
if strings.Contains(strings.ToLower(firstLang), "en") {
|
||||||
|
locale = "en"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
redirectBase, parseErr := url.Parse(fmt.Sprintf("%s/%s/reset-password", strings.TrimRight(userfrontURL, "/"), locale))
|
||||||
if parseErr != nil {
|
if parseErr != nil {
|
||||||
ale.Status = fiber.StatusInternalServerError
|
ale.Status = fiber.StatusInternalServerError
|
||||||
ale.LatencyMs = time.Since(startTime)
|
ale.LatencyMs = time.Since(startTime)
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import '../../../core/i18n/locale_utils.dart';
|
||||||
|
import '../../../core/services/auth_token_store.dart';
|
||||||
import '../../../core/services/auth_proxy_service.dart';
|
import '../../../core/services/auth_proxy_service.dart';
|
||||||
import '../../../core/ui/toast_service.dart';
|
import '../../../core/ui/toast_service.dart';
|
||||||
import 'package:userfront/i18n.dart';
|
import 'package:userfront/i18n.dart';
|
||||||
@@ -48,7 +51,17 @@ class _ForgotPasswordScreenState extends State<ForgotPasswordScreen> {
|
|||||||
);
|
);
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
ToastService.success(tr('msg.userfront.forgot.sent'));
|
ToastService.success(tr('msg.userfront.forgot.sent'));
|
||||||
Navigator.of(context).pop();
|
if (context.canPop()) {
|
||||||
|
context.pop();
|
||||||
|
} else {
|
||||||
|
final isLoggedIn = AuthTokenStore.hasToken();
|
||||||
|
final localeCode = extractLocaleFromPath(Uri.base) ?? resolvePreferredLocaleCode();
|
||||||
|
if (isLoggedIn) {
|
||||||
|
context.go('/$localeCode/profile');
|
||||||
|
} else {
|
||||||
|
context.go('/$localeCode/signin');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
|
|||||||
@@ -1097,11 +1097,6 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
|
|||||||
)
|
)
|
||||||
: Text(tr('ui.userfront.profile.password.change')),
|
: Text(tr('ui.userfront.profile.password.change')),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 12),
|
|
||||||
TextButton(
|
|
||||||
onPressed: () => context.go('/recovery'),
|
|
||||||
child: Text(tr('ui.userfront.profile.password.forgot')),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
Reference in New Issue
Block a user