加载中...
不想等待可以点我关掉

前言

我服务器是离线登录的,一直以来都是本地打mod来实现显示皮肤。昨天有人折腾了半天,仔细想想要不整个外置登录吧,然后一步一个坑,记录一下

搭建

Blessing Skin

修改环境配置

官方不建议用面板类程序部署,因为会禁用某些php函数,启用就好。在禁用函数或在php.ini里面的disable_functions里去掉以下函数

  • symlink
  • readlink
  • putenv
  • realpath

同时,安装必需的 PHP (<8.2)扩展:

折叠啦
  • OpenSSL >= 1.1.1 (TLS 1.3)
  • PDO
  • Mbstring
  • Tokenizer
  • GD
  • XML
  • Ctype
  • JSON
  • fileinfo
  • zip

本体

Releases下载程序包并解压,设置运行目录/public,或在配置文件里设置root /{yourwebsitespath}/public;

设置伪静态:

1
2
3
location / {
try_files $uri $uri/ /index.php?$query_string;
}

若开启了防跨站安全设置需关闭

安装

配置完伪静态后,直接访问对应的域名就能跳转到安装页面了,在完成基本的安装后,在插件市场里安装Yggdrasil API并启用

image-20240719142918745
image-20240719142918745
image-20240719142941137
image-20240719142941137

最后可以尝试访问//{yourwebsites}/api/yggdrasil看看有无类似以下输出

image-20240719143149605
image-20240719143149605

扩展

为更方便的管理玩家,可以在安装邀请码插件来避免多次/外部人员注册

常见问题

  1. 图片无法显示/页面混乱

    请检查你的 Nginx 规则配置中是否有这类控制浏览器缓存的规则,删除即可:

    1
    2
    3
    4
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
    expires 30d;
    access_log off;
    }
  2. 插件市场无法使用

    .env里添加PLUGINS_REGISTRY=https://d2jw1l0ullrzt6.cloudfront.net/registry_{lang}.json

  3. 验证邮箱地址报403 Forbidden,无效的链接:参阅验证邮箱地址报403 Forbidden,无效的链接

  4. 报错:Lcobucci\JWT\Signer\Key\InMemory::plainText(): Argument #1 ($contents) must #21 10.08 be of type string, null given

    .env里添加JWT_SECRET=...值与APP_KEY一致

游戏服务端

这是原本的游玩路径

image-20240719144316520
image-20240719144316520

可见有一些不足:玩家每一次登录都要敲密码,新玩家还要手动加白名单,但使用了外置登陆后这些都可以丢掉了。authlib-injector通过“劫持”官方的正版验证接口,实现了一种特殊的认证,与正版无异。只需要一个账户就可以畅玩服务器。

image-20240719144846911
image-20240719144846911

游戏服务端

下载authlib-injector到服务端同级目录

在启动命令的-jar参数前加上-javaagent:authlib-injector-1.xx.xx.jar=https://{yourwebsites}/api/yggdrasil,注意更改版本号和网站为对应的

由于是“劫持”官方的正版验证接口,还需要开启正版验证(online-mode设置为true

尝试启动看看日志输出类似文本即可

image-20240719145808855
image-20240719145808855

尝试连接吧~

常见问题

  1. 无效对话:设置prevent-proxy-connections = false
  2. 无法使用游戏内聊天,由于个人信息公钥丢失,聊天已被禁用。请尝试重新连接:设置enforce-secure-profile=false
  3. 无法验证玩家用户名:检查皮肤站是否正常运行,在.env中打开调试模式(APP_DEBUG),检查./storage/logs中的日志内容

Geyser

由于是“劫持”官方的正版验证接口(梅花三弄),对于独立版同样需要外挂authlib-injector

只需要找到对应的下载下来,参考游戏服务端的运行方式就可以了…吗?

在高版本的Geyser中,已经移除了Mojang账户的登录接口,很不巧的是这里就要用到它,所以你还要把它加回来。

如果只需要最新版看这里就好:Shanwer/Geyser

  1. fork Geyser 到自己账号,再clone到本地

  2. 因为我的服务器版本不是最新的,还要找到适合的版本,可以在GameProtocol.java里面找,如我要编译适合1.20.1的版本,先找到drop掉的前一个commit,复制commit id

    image-20240719152914544
    image-20240719152914544
    image-20240719152948254
    image-20240719152948254
  3. 执行

    $
    切换到对应版本,新建一个分支,如build

    $
  4. 参考这里来进行修改代码,修改完毕后推送到新分支

    本地化处理:

    原仓库对于外置登录做了些文本上的调整,运行以下命令切换

    1
    2
    git rm --cached "core/src/main/resources/languages"
    git submodule add https://github.com/Silverteal/geyser-languages-for-custom-yggdrasil.git core/src/main/resources/languages
    $
  5. 随后启用action并在action选择对应的分支构建

image-20240719153529593
image-20240719153529593
  1. 在构建完成后下载(我这里是独立版,插件版操作类似

    在action页面里找到刚刚完成的构建
    在action页面里找到刚刚完成的构建
    下载到本地
    下载到本地
  2. 运行并调整配置即可

常见问题

  1. 此服务器需要一个付费的Java账号:因为 Geyser 本身的问题,无法使用有多角色的外置登录解决方案,也就是说皮肤站内有多个角色时无法登录

效果

皮肤共通
皮肤共通

一天啊,总算整好了~

文章看起来顺风顺水的,天都不知道我试多少条破路