# StarlightSkin 让装了 `authlib-injector`(指向 StarLight 皮肤站)的 Minecraft 客户端能正常显示皮肤站的皮肤。 - Minecraft 26.1.2 / Fabric - 纯客户端 Mod ## 原理 Minecraft 客户端对皮肤 URL 有**硬编码的域名白名单**: ```java // com.mojang.authlib.yggdrasil.TextureUrlChecker private static final Set ALLOWED_DOMAINS = Set.of("textures.minecraft.net"); ``` 皮肤站下发的皮肤 URL(`https://skin.starlight.cool/yggdrasil/textures/...`)域名不在白名单里, `isAllowedTextureDomain` 返回 `false`,`unpackTextures` 直接丢弃该皮肤并打印: ``` Textures payload url is invalid: https://skin.starlight.cool/yggdrasil/textures/xxx ``` 结果就是所有皮肤站玩家的皮肤都显示成默认皮肤。 本 Mod 通过两个 Mixin 解决: 1. **`TextureUrlCheckerMixin`**(必需) 注入 `TextureUrlChecker.isAllowedTextureDomain`,在默认判定为 `false` 时, 额外放行 `skin.starlight.cool` 域名。 2. **`YggdrasilMinecraftSessionServiceMixin`** 皮肤站用自己私钥对 `textures` 属性签名,客户端默认不信任该公钥(`SignatureState.INVALID`)。 本 Mixin 在验签失败时,用皮肤站公钥(内置 / 运行时拉取)重新验签,通过则改为 `SIGNED`。 ## 公钥 - 内置兜底公钥(来自皮肤站 `https://skin.starlight.cool/yggdrasil` 的 `signaturePublickey`) - 启动时优先从皮肤站拉取,失败则用内置 ## 构建 ```bash # 需要 Java 25 ./gradlew build ``` 产物:`build/libs/starlight-skin-.jar`,放入 `.minecraft/mods/`。 ## 已知约束 - 皮肤站域名硬编码为 `skin.starlight.cool`(见 `StarlightConstants`)。 若换域名,需改 `StarlightConstants.ALLOWED_SKIN_DOMAINS` 并重新构建。