diff --git a/cmd/auth/login_messages.go b/cmd/auth/login_messages.go index 2fe0ebb76..268b1f9a1 100644 --- a/cmd/auth/login_messages.go +++ b/cmd/auth/login_messages.go @@ -29,7 +29,6 @@ type loginMsg struct { ScopeHint string RequestedScopes string NewlyGrantedScopes string - MissingScopes string NoScopes string StatusHint string @@ -59,14 +58,13 @@ var loginMsgZh = &loginMsg{ OpenURL: "在浏览器中打开以下链接进行认证:\n\n", WaitingAuth: "等待用户授权...", - AuthSuccess: "授权已完成,正在获取用户信息并校验授权结果...", + AuthSuccess: "已收到授权确认,正在获取用户信息并校验授权结果...", LoginSuccess: "授权成功! 用户: %s (%s)", AuthorizedUser: "当前授权账号: %s (%s)", - ScopeMismatch: "授权结果异常:以下请求 scopes 未被授予: %s", + ScopeMismatch: "授权结果异常: 以下请求 scopes 未被授予: %s", ScopeHint: "以上结果是本次授权请求用户最终确认后的结果,请勿持续重试;Scopes 未授予的原因是多样的,如 scope 被禁用;具体原因已通过授权页提示用户。可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", RequestedScopes: " 本次请求 scopes: %s\n", NewlyGrantedScopes: " 本次新授予 scopes: %s\n", - MissingScopes: " 本次未授予 scopes: %s\n", NoScopes: "(空)", StatusHint: "可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", @@ -95,14 +93,13 @@ var loginMsgEn = &loginMsg{ OpenURL: "Open this URL in your browser to authenticate:\n\n", WaitingAuth: "Waiting for user authorization...", - AuthSuccess: "Authorization completed, fetching user info and validating granted scopes...", + AuthSuccess: "Authorization confirmed, fetching user info and validating granted scopes...", LoginSuccess: "Authorization successful! User: %s (%s)", AuthorizedUser: "Authorized account: %s (%s)", ScopeMismatch: "authorization result is abnormal: these requested scopes were not granted: %s", ScopeHint: "The result above is the user's final confirmation for this authorization request. Do not retry continuously. Scopes may be not granted for various reasons, such as a scope being disabled. The specific reason has already been shown to the user on the authorization page. Run `lark-cli auth status` to inspect all scopes currently granted to the account.", RequestedScopes: " Requested scopes: %s\n", NewlyGrantedScopes: " Newly granted scopes: %s\n", - MissingScopes: " Not granted scopes: %s\n", NoScopes: "(none)", StatusHint: "Run `lark-cli auth status` to inspect all scopes currently granted to the account.", diff --git a/cmd/auth/login_result.go b/cmd/auth/login_result.go index 3e649579d..abe63e354 100644 --- a/cmd/auth/login_result.go +++ b/cmd/auth/login_result.go @@ -128,7 +128,7 @@ func emptyIfNil(s []string) []string { return s } -// writeLoginScopeBreakdown renders the requested/newly granted/missing scope +// writeLoginScopeBreakdown renders the requested/newly granted scope // breakdown to stderr. func writeLoginScopeBreakdown(errOut *cmdutil.IOStreams, msg *loginMsg, summary *loginScopeSummary) { if summary == nil { @@ -136,7 +136,6 @@ func writeLoginScopeBreakdown(errOut *cmdutil.IOStreams, msg *loginMsg, summary } fmt.Fprintf(errOut.ErrOut, msg.RequestedScopes, formatScopeList(summary.Requested, msg.NoScopes)) fmt.Fprintf(errOut.ErrOut, msg.NewlyGrantedScopes, formatScopeList(summary.NewlyGranted, msg.NoScopes)) - fmt.Fprintf(errOut.ErrOut, msg.MissingScopes, formatScopeList(summary.Missing, msg.NoScopes)) } // writeLoginSuccess emits the successful login payload in either JSON or text diff --git a/cmd/auth/login_test.go b/cmd/auth/login_test.go index e110c7903..a3b84af37 100644 --- a/cmd/auth/login_test.go +++ b/cmd/auth/login_test.go @@ -363,7 +363,7 @@ func TestWriteLoginSuccess_JSONIncludesScopeDiff(t *testing.T) { func TestHandleLoginScopeIssue_NonJSONAlignsWithLoginSuccess(t *testing.T) { f, _, stderr, _ := cmdutil.TestFactory(t, nil) err := handleLoginScopeIssue(&LoginOptions{}, getLoginMsg("zh"), f, &loginScopeIssue{ - Message: "授权结果异常:以下请求 scopes 未被授予: im:message:send", + Message: "授权结果异常: 以下请求 scopes 未被授予: im:message:send", Hint: "以上结果是本次授权请求用户最终确认后的结果,请勿持续重试;Scopes 未授予的原因是多样的,如 scope 被禁用;具体原因已通过授权页提示用户。可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", Summary: &loginScopeSummary{ Requested: []string{"im:message:send"}, @@ -376,11 +376,10 @@ func TestHandleLoginScopeIssue_NonJSONAlignsWithLoginSuccess(t *testing.T) { } got := stderr.String() for _, want := range []string{ - "授权结果异常:以下请求 scopes 未被授予: im:message:send", + "授权结果异常: 以下请求 scopes 未被授予: im:message:send", "当前授权账号: tester (ou_user)", "本次请求 scopes: im:message:send", "本次新授予 scopes: (空)", - "本次未授予 scopes: im:message:send", "以上结果是本次授权请求用户最终确认后的结果,请勿持续重试", "scope 被禁用", "lark-cli auth status", @@ -395,6 +394,9 @@ func TestHandleLoginScopeIssue_NonJSONAlignsWithLoginSuccess(t *testing.T) { if strings.Contains(got, "授权成功") { t.Fatalf("stderr should not contain success wording, got:\n%s", got) } + if strings.Contains(got, "本次未授予 scopes:") { + t.Fatalf("stderr should not duplicate missing scopes, got:\n%s", got) + } } func TestHandleLoginScopeIssue_JSONAlignsWithLoginSuccess(t *testing.T) { @@ -472,10 +474,10 @@ func TestWriteLoginSuccess_TextOutputScenarios(t *testing.T) { "授权成功! 用户: tester (ou_user)", "本次请求 scopes: im:message:send im:message:reply", "本次新授予 scopes: im:message:send", - "本次未授予 scopes: (空)", "可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", }, expectedAbsent: []string{ + "本次未授予 scopes:", "最终已授权 scopes:", "已有 scopes:", }, @@ -490,10 +492,10 @@ func TestWriteLoginSuccess_TextOutputScenarios(t *testing.T) { expectedPresent: []string{ "本次请求 scopes: im:message:send", "本次新授予 scopes: (空)", - "本次未授予 scopes: (空)", "可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", }, expectedAbsent: []string{ + "本次未授予 scopes:", "最终已授权 scopes:", "已有 scopes:", }, @@ -508,9 +510,9 @@ func TestWriteLoginSuccess_TextOutputScenarios(t *testing.T) { expectedPresent: []string{ "本次请求 scopes: im:message:send im:message:reply", "本次新授予 scopes: (空)", - "本次未授予 scopes: im:message:send", }, expectedAbsent: []string{ + "本次未授予 scopes:", "已有 scopes:", "最终已授权 scopes:", "可执行 `lark-cli auth status` 查看账号当前已授予的全部 scopes;", @@ -619,10 +621,9 @@ func TestAuthLoginRun_MissingRequestedScopeAlignsWithLoginSuccess(t *testing.T) } got := stderr.String() for _, want := range []string{ - "授权结果异常:以下请求 scopes 未被授予: im:message:send", + "授权结果异常: 以下请求 scopes 未被授予: im:message:send", "当前授权账号: tester (ou_user)", "本次请求 scopes: im:message:send", - "本次未授予 scopes: im:message:send", "以上结果是本次授权请求用户最终确认后的结果,请勿持续重试", "scope 被禁用", "lark-cli auth status", @@ -637,6 +638,9 @@ func TestAuthLoginRun_MissingRequestedScopeAlignsWithLoginSuccess(t *testing.T) if strings.Contains(got, "OK: 授权成功") { t.Fatalf("stderr should not contain success prefix when scopes are missing, got:\n%s", got) } + if strings.Contains(got, "本次未授予 scopes:") { + t.Fatalf("stderr should not duplicate missing scopes, got:\n%s", got) + } if strings.Contains(got, "ERROR:") { t.Fatalf("stderr should not contain error prefix, got:\n%s", got) } @@ -777,13 +781,15 @@ func TestWriteLoginSuccess_TextOutputEnglishIncludesStatusHintWhenNoMissingScope "Authorization successful! User: tester (ou_user)", "Requested scopes: im:message:send", "Newly granted scopes: im:message:send", - "Not granted scopes: (none)", "Run `lark-cli auth status` to inspect all scopes currently granted to the account.", } { if !strings.Contains(got, want) { t.Fatalf("stderr missing %q, got:\n%s", want, got) } } + if strings.Contains(got, "Not granted scopes:") { + t.Fatalf("stderr should not contain not granted scopes, got:\n%s", got) + } } func TestAuthLoginRun_DeviceCodeTokenNilCleansScopeCache(t *testing.T) { diff --git a/internal/auth/device_flow.go b/internal/auth/device_flow.go index 7d2c8ca41..965c6eeb5 100644 --- a/internal/auth/device_flow.go +++ b/internal/auth/device_flow.go @@ -200,7 +200,7 @@ func PollDeviceToken(ctx context.Context, httpClient *http.Client, appId, appSec errStr := getStr(data, "error") if errStr == "" && getStr(data, "access_token") != "" { - fmt.Fprintf(errOut, "[lark-cli] device-flow: token obtained successfully\n") + fmt.Fprintf(errOut, "[lark-cli] device-flow: token response received\n") refreshToken := getStr(data, "refresh_token") tokenExpiresIn := getInt(data, "expires_in", 7200) refreshExpiresIn := getInt(data, "refresh_token_expires_in", 604800)