惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
有赞技术团队
有赞技术团队
WordPress大学
WordPress大学
月光博客
月光博客
T
Tailwind CSS Blog
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
罗磊的独立博客
Jina AI
Jina AI
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
量子位
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
博客园 - 聂微东
V
V2EX

Kenvix's Blog

实现带有Nvidia GPU+Rootless Podman+Docker+Systemd+自动驱动注入支持的systemd nspawn容器 | Kenvix's Blog 手动保留常用端口,解决 Windows 端口被 Hyper-V / WinNAT 占用的问题 免Telent/TTL屏蔽运营商新版光猫的远控、TR069和RMS,获取动态随机超级管理员密码并固化权限 | Kenvix's Blog 利用Windows卷影副本(Volume Shadow)找回被覆盖和删除的数据 | Kenvix's Blog 在Windows下实现WireGuard动态DNS解析(DDNS)的正确方法:避免无意义的开销 | Kenvix's Blog OpenWRT/DNSMasq 配置DHCP静态路由主动推送 实现流量直达和旁路由流量零代价分载 | Kenvix's Blog 解决 Windows 打开视频/图片文件夹很慢的问题 | Kenvix's Blog AltA2DP - 向支持Sony LDAC协议的耳机提供Windows下蓝牙LDAC音频编码器支持 | Kenvix's Blog (2024更新)修复黑群晖 DSM7.0 + Btrfs 存储空间/磁盘损毁/堪用 的问题 校园网白嫖思路分享:局域网中转-不花钱、不认证、高速上网 | Kenvix's Blog 在 Windows 上配置网卡多个 VLAN、多个虚拟网卡、实现单线多拨网速叠加(无需驱动支持) | Kenvix's Blog 解决视频彩铃、语音通话自动转视频通话导致打电话自动挂断的问题 | Kenvix's Blog 超低成本廉价考研教程:如何用小于¥500甚至¥300的开销考个研 | Kenvix's Blog 在 Ubuntu 21.10 上启用蓝牙 LDAC/AAC/AptX 高质量音频编码支持 在 VMware Workstation 桥接模式的网卡上让虚拟机使用 VLAN 的正确方法 在 Windows 上设置 NAT 或网络共享的正确方法——避免Wi-Fi热点无法使用 自编译 红米 AC2100 OpenWRT R21.7.26 Linux 内核结构和子系统简介 | Kenvix's Blog Java 快速读取文本 (算法竞赛适用) | Kenvix's Blog 利用 ThreadLocal + Lambda,实现有状态变量的单例模式 | Kenvix's Blog 状态压缩的动态规划问题:骨牌完全覆盖棋盘问题 | Kenvix's Blog 我的 Windows 10 2004 新增 Bug 解决办法记录 解决 Android Studio 及 IDEA 中 Gradle 错误信息乱码的问题 Kotlin 的那些骚操作 | Kenvix's Blog 在普通的 Gradle Java/Kotlin 项目中使用 BuildConfig 修复国行 MIUI 打开 Google Play 始终提示 DF-DFERH-01 的问题 解决 VSCode 持续调用 WMIC 导致一个 CPU 核心完全被占满的问题 扔鸡蛋问题 | Kenvix's Blog 计算机幻觉从入门到入土 | Kenvix's Blog Java 注解预处理 Annotation Processing & 代码生成
真正实现Minecraft高级登录(外置登录)的几种方案 | Kenvix's ...
2018-07-21 · via Kenvix's Blog

通常把Minecraft服务器的登录方式分为高级登录(外置登录)和内置登录。高级登录的特点是用户的登录操作在启动器完成,启动器传递token给Minecraft客户端,客户端在加入服务器时直接将token传递给服务端完成身份验证。正版Minecraft登录就是典型的外置登录。而一般的非正版服务器(online-mode=false)则是身份验证仅在用户加入游戏后通过聊天框输入密码完成认证,此时用户已经加入了游戏,仅仅靠登录插件来限制用户进行其他操作。
而内置登录往往存在下列问题:

  1. 玩家在登录前已经进入了游戏。恶意用户可以借此进行假人压测攻击服务器
  2. 由于登录操作复杂并且退出游戏后就需要重新登录,玩家往往把密码设置得较为简单,留下安全隐患
  3. 对于Mod服务器来说,登录插件无法限制Mod行为。例如NEI仍然可以正常使用而不受登录插件限制

如果想根除上述问题,就必须要改换成高级登录。

实现

倘若从零开始自己写一套外部登录系统,意味着我们需要自己写服务端插件+验证端+客户端模组+启动器,还需要考虑兼容性、跨平台等问题。显然,这项工程十分浩大并且不划算。换个思路,mojang已经实现了自己的正版登录系统,我们能否将minecraft自带的正版登录系统为己所用呢?

方案1: 用hosts劫持域名解析

操作复杂度:高

修改操作系统的hosts文件:
(1.2.3.4为你的身份验证服务器IP地址)

1.2.3.4 sessionserver.mojang.com
1.2.3.4 api.mojang.com

然后,自己签署一个具有“所有颁发策略” “所以应用程序策略”的根证书,在MC服务器和身份验证服务器两边信任这个根证书。
接着,自己签发 *.mojang.com 的SSL证书,部署到身份验证服务器,对这两个域名使用自签发证书。
最后,自己按照此文档实现一套Yggdrasil服务端。
至于启动器方面也很简单,拿一套开源的启动器的代码(如BMCL,HMCL)然后批量替换上面给出的两个域名为你的身份验证服务器的域名,然后编译即可。
(用于客户端登录的身份验证服务器必须使用正规证书机构签发的证书,如let’s encrypt,当然你要是能拿到管理员权限悄悄导入根证书就不用管这句提示了)

方案2:用javaagent在运行时动态劫持身份验证地址

操作复杂度:中高

国内有大神已经实现了这种方案,并且最新的HMCL启动器原生支持使用这种方案实现客户端的高级登录。
点击此处查看,同样需要按照此文档实现一套Yggdrasil服务端
具体使用方法可以参考Blessing Studio上的文章

比起方案1,这个方案的优点是可以略过复杂的签发证书过程,并且API地址可以随便起,自己怎么爽怎么来(比如MoeCraft这样:https://accounts.moecraft.net/?s=API/Mc/Authlib&params=/)

方案3:使用他人编写Mod+插件+启动器解决

操作复杂度:低

参见SakuraLogin 樱花登录,可惜不支持 Sponge :(

附注

上文提到的《Yggdrasil服务端技术规范》中有一点需要注意:
以“用户部分-登录”为例,文档中的“请求格式”并 不是在用JSON描述这个请求POST内容的具体格式 ,而是真的POST了一个JSON文本过来!这点很误导人。
以PHP为例,使用 $_POST 无法获得任何数据,要获得POST提交的文本,应该使用 file_get_contents('php://input') 直接读取请求的原始数据