# Web 应用 Cook 只保留 Web 一套代码,服务普通浏览器和云乐坊容器。技术栈: - [Nuxt 4](https://nuxt.com/)(Vue 3,CSR-only,静态生成) - [Ionic](https://ionicframework.com/) + [Nuxt Ionic](https://ionic.nuxtjs.org/)(Web UI 框架,与 Capacitor 无关) - [UnoCSS](https://unocss.dev/) 原子化样式 原生 App(iOS / Android)的代码已随 [0004 只保留 Web,移除 Capacitor 原生壳](/decisions/0004-web-only) 一并移除。 ## 云乐坊 SSO Web 端有两种登录路径: - **在云乐坊 App 容器内**:通过宿主注入的 `window.ylf` JSAPI 直接请求宿主授权面板,用户不离开当前页面。 - **在普通浏览器中**:走顶层重定向到云乐坊授权页,授权完成后回到 `https://cook.yunyoujun.cn/auth/callback`,由该页面换回登录票据。 回跳地址必须是已在云乐坊登记的 HTTPS 地址,且不能带 `?platform=native` 之类的原生标记。 PKCE 能阻止授权码被旁路窃取,但不能阻止恶意客户端主动冒充公开客户端发起授权, 因此不要放宽回跳地址的登记要求。 回跳域名有多个时(`cook.yunyoujun.cn`、`cook.yunle.fun`),按当前页面 origin 选对应的那个, `yunlefunSsoRedirectUris` 里没登记的域名会直接判定为配置错误并拒绝登录。