mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-27 14:59:09 +01:00
[client] Keep the forced account prompt from being lost to flow reuse
startSSOLogin consumed forceAccountPrompt and applied the prompt to the freshly built flow, but reuseOAuthFlow could then answer from a cached flow for the same client — one built without prompt=login, e.g. by RequestJWTAuth. The user got the same silent authorization URL that produced the mismatch, with the flag already spent, so no later round asked either. Rule reuse out when the prompt is forced, while still cancelling the predecessor's wait. RequestJWTAuth also wrote the flow fields one by one, leaving the previous login's hint and accountPrompted behind for WaitSSOLogin to judge a later token against. Both sites now replace the whole record.
This commit is contained in:
@@ -148,6 +148,26 @@ func TestWaitSSOLogin_JudgesTheFlowThatProducedTheToken(t *testing.T) {
|
||||
require.False(t, s.forceAccountPrompt, "the prompt was armed off another flow's hint")
|
||||
}
|
||||
|
||||
func TestReuseOAuthFlow_ForcedPromptRefusesTheCachedFlow(t *testing.T) {
|
||||
s := New(internal.CtxInitState(context.Background()), "console", "", false, false, false, false)
|
||||
cancelled := false
|
||||
s.oauthAuthFlow = oauthAuthFlow{
|
||||
flow: &stubOAuthFlow{},
|
||||
info: auth.AuthFlowInfo{UserCode: "code"},
|
||||
expiresAt: time.Now().Add(time.Hour),
|
||||
waitCancel: func() { cancelled = true },
|
||||
}
|
||||
|
||||
state := internal.CtxGetState(s.rootCtx)
|
||||
resp := s.reuseOAuthFlow(context.Background(), &stubOAuthFlow{}, state, true)
|
||||
require.Nil(t, resp, "a forced account prompt reused the flow that skipped it")
|
||||
require.True(t, cancelled, "the predecessor wait was orphaned")
|
||||
|
||||
resp = s.reuseOAuthFlow(context.Background(), &stubOAuthFlow{}, state, false)
|
||||
require.NotNil(t, resp, "an unforced login stopped reusing a live flow")
|
||||
require.Equal(t, "code", resp.UserCode)
|
||||
}
|
||||
|
||||
func newSSOTestServer(t *testing.T, hint string, accountPrompted bool, tokenEmail string) *Server {
|
||||
t.Helper()
|
||||
s := New(internal.CtxInitState(context.Background()), "console", "", false, false, false, false)
|
||||
|
||||
Reference in New Issue
Block a user