fix:修复了一下皮肤站的登录逻辑
Some checks failed
Axolotl desktop CI / guardrails (push) Has been cancelled
Axolotl desktop CI / desktop (macos-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (ubuntu-latest) (push) Has been cancelled
Axolotl desktop CI / desktop (windows-latest) (push) Has been cancelled
Axolotl desktop CI / website (push) Has been cancelled
Repository checks / typos (push) Has been cancelled
Repository checks / tombi (push) Has been cancelled
Rust checks / shear (push) Has been cancelled
Sync source to CNB / Sync Git ref (push) Has been cancelled

This commit is contained in:
2026-09-13 20:18:04 +08:00
parent 89aa661e75
commit f8aa654198

View File

@ -213,56 +213,29 @@ pub async fn begin_yggdrasil_login(
.as_error()); .as_error());
} }
// 逐个角色 refresh + 保存,实现「一次登录自动加入所有角色」。 // 不在此处激活任何角色authenticate 只拿到一条 clientToken 链,
// Yggdrasil 同一时刻只激活一个角色,因此需要串行 refresh并各自保存当次 token。 // 若循环 refresh 多个角色,同一 clientToken 下后一次会顶掉前一次的
let mut access_token = response.access_token.clone(); // accessToken,导致只有最后一个角色有效。因此改为返回
let mut client_token = response.client_token.clone(); // `SelectProfile`,由前端弹出选择框,老板选中后用
let mut last_credentials: Option<Credentials> = None; // `finish_yggdrasil_login` 单独 refresh 该角色。
// 需要多个角色时重复登录、各选一个,每个角色持有独立的 clientToken。
let _ = exec;
for (index, profile) in profiles.iter().enumerate() { let flow_id = Uuid::new_v4();
let refreshed = refresh_selected_profile( PENDING_LOGINS.lock().await.insert(
&metadata.api_root, flow_id,
&access_token, PendingYggdrasilLogin {
&client_token, created: Instant::now(),
profile, api_root: metadata.api_root,
) server_name: metadata.server_name,
.await?; login: login.to_string(),
let selected_profile = refreshed.selected_profile.ok_or_else(|| { access_token: response.access_token,
ErrorKind::OtherError( client_token: response.client_token,
"The Yggdrasil service did not select the requested profile" profiles: profiles.clone(),
.to_string(),
)
.as_error()
})?;
access_token = refreshed.access_token.clone();
client_token = refreshed.client_token.clone();
let mut credentials = create_credentials(
selected_profile,
refreshed.access_token,
refreshed.client_token,
YggdrasilMetadata {
api_root: metadata.api_root.clone(),
server_name: metadata.server_name.clone(),
raw: String::new(),
}, },
login,
); );
// 仅让最后一个(通常是默认/首个以外的角色)保持 active避免多个 active。
credentials.active = index == profiles.len() - 1;
credentials.upsert(exec).await?;
last_credentials = Some(credentials);
}
if let Some(credentials) = last_credentials { Ok(YggdrasilLoginResult::SelectProfile { flow_id, profiles })
return Ok(YggdrasilLoginResult::Complete { credentials });
}
Err(ErrorKind::OtherError(
"The Yggdrasil account does not have a Minecraft profile"
.to_string(),
)
.as_error())
} }
pub async fn finish_yggdrasil_login( pub async fn finish_yggdrasil_login(