格兰蒂协会

 找回密码
 立即注册
快捷导航
搜索
查看: 343|回复: 1
收起左侧

[资源] 【服务端插件】MultiLogin | 正版与多种外置共存[1.8+]

[复制链接]

92

积分

106

金币

1

点数

Lv.4

Rank: 4Rank: 4Rank: 4Rank: 4

积分
92
发表于 2021-10-7 15:31:57 | 显示全部楼层 |阅读模式
我的世界
原创度: 原创
原帖地址: https://github.com/CaaMoe/MultiLogin

你好像忘了登录了...

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 MiaoLio 于 2021-10-18 12:04 编辑


  MultiLogin | 正版与外置共存

| 什么是外置登录和多外置登录共存?

        外置登录其实就是正版登录,在连接和登入服务器时验证账户身份,而不用在游戏内输入 “/login password” 和 “/register password confirm” 来注册和登入。(详见 authlib-injector 开源的游戏外登录规范
           
            多外置登录共存是能让一个服务器能支持使用多种不同的外置登录方式进行游戏的一种机制,比如某个服务器可以同时支持正版登录、统一通行证、皮肤战登录,从而不需要所谓的一刀切,强制用户注册更多的、不必要的账户。

| 插件功能

  • 多 Yggdrasil 共存 支持更多的 Yggdrasil 账户验证服务器共存,比 YOP 的还要多
  • 高度可配置的 Yggdrasil 方式 支持市面上几乎所有类型的 Yggdrasil 账户验证服务器
  • 账户安全机制 限制只使用其中一种 Yggdrasil 登入方式,杜绝可能出现的重复 UUID 问题
  • 用户名核查 阻止服务器内出现同名账户。
  • 抢注机制 设置某一验证服务器下的玩家可以使用已被记录的用户名强制登入游戏
  • 正则检查 多 Yggdrasil 下分组设置的用户名正则匹配检查
  • 高级白名单系统 多 Yggdrasil 下分组管理的白名单系统
  • 重复登入机制 可设置掉线或强登
  • 控制玩家在游戏内的 UUID 一把锁,两把钥匙
  • PlaceholderAPI 变量支持 Bukkit Only
  • 皮肤问题修复 使正版在不装 CSL 的情况下也能看到外置登入的皮肤
  • 多端支持、超高兼容性 支持 Velocity、Bungee、Bukkit甚至 Fabric 和插件模组端Arclight、CatServer [1.8+]


| 关于混合验证登入下的账户安全问题

由于 Minecraft 原版机制,玩家数据都是使用从外置登录传来的 UUID 作为主键进行读取和保存的,即一个外置服务器下是绝不可能存在有两个相同 UUID 的账户。
而多个外置服务器下是很有可能存在有两个相同 UUID 的账户,这就使得一旦出现这些账户,数据安全将难以保证,并且极难排查,这将是个毁灭性的后果。

MultiLogin 通过记录和保存玩家第一次登入成功后使用的外置登入服务器的path来判断是否允许登入游戏,这就使得重复 UUID 的两个账户杀一个留一个,从而极大的保证了数据安全。
比如 正版账户A 与 外置账户B 的 UUID 重复,且 A 和 B 从未登入过服务器,当 A 抢先一步登入系统后,B 尝试登入时将会被踢出并且提示 您只能通过 ‘正版’ 的登入方式进入游戏。

能不能让两个重复 UUID 的账户也能登入游戏并且又能保证数据安全呢?这当然可以,控制玩家在游戏内的 UUID 也是插件的一大特色功能。但是安全性等待考量,所以现在不行

关于服务器内可能会出现同名问题,MultiLogin 当然也有考虑到(阻止服务器内出现同名账户)。并且还附加了一些有关用户名的实用功能,具体请看配置文件注释

| 相关图片


测试未添加进去的外置账户(在Velocity使用MySQL)


测试重复UUID登入(修改数据库值)


测试皮肤修复功能(正版视角能看到外置登入的皮肤)

| 如何使用?

与同类型程序相比,MultiLogin 不需要修改或添加任何服务端启动参数(不需要安装任何 authlib-injector 以及同类型前置 javaagent 程序), 只需将适合服务端的插件本体丢入 plugins(mods) 文件夹下即可。


| 外置配置模板和添加一个外置服务器

模板(配置文件片段):

  1. # 这是一个示例配置:
  2. # 节点名称 'demo' 作为混合验证系统区分 Yggdrasil 验证服务器唯一性的凭据,设置好后请不要随意的去改动它,
  3. # 随意的更改节点名称将会导致二次验证系统无法验明用户身份而拒绝用户的登入请求。
  4. # 可以仿写此节点用来添加新的 Yggdrasil 账户验证服务器。
  5. demo:

  6.     # 启用该验证服务器。
  7.     # 值为 'false' 时将不添加该 Yggdrasil 账户验证服务器到混合登入系统中去,将拒绝一切使用该 Yggdrasil 账户验证服务器的玩家登入游戏。
  8.     # 默认值 'true'
  9.     enable: false

  10.     # 该账户验证服务器中的别称。
  11.     # 不用于父节点名称,此节点的值可以随意修改。
  12.     # 必填值,在 Bukkit 服务端中作为变量传递。
  13.     name: "Demo Yggdrasil"

  14.     # Yggdrasil 账户验证服务器的基本属性和信息设置。
  15.     body:

  16.       # Yggdrasil 账户验证服务器服务端 hasJoined 阶段部分验证请求链接设置。
  17.       # 此节点必须指定完整的请求链接。
  18.       # 其中 GET 请求中的占位变量 {username} 表示 username,占位变量 {serverId} 表示 serverId,
  19.       #        占位变量 {passIpContent} 表示 passIpContent 节点所设置的内容。
  20.       # 请求的 URL 对大小写敏感,设置需谨慎!
  21.       # 一些例子:
  22.       #      GET: "https://example.com/session/minecraft/hasJoined?username={username}&serverId={serverId}{passIpContent}"
  23.       #      GET: "https://example.com/session/minecraft/hasJoined?username={username}&serverId={serverId}"
  24.       #      POST: "https://example.com/session/minecraft/hasJoined"
  25.       # 必填值
  26.       url: "https://example.com/session/minecraft/hasJoined?username={username}&serverId={serverId}"

  27.       # hasJoined 阶段使用 POST 请求的方式验证账户身份。
  28.       # 绝大多数下, Yggdrasil 账户验证服务器 hasJoined 阶段都采用 GET 请求方式验证用户数据的,
  29.       # 如果你不了解当前 Yggdrasil 验证流程的话,请勿擅自改动它。
  30.       # 默认值 'false'
  31.       postMode: false

  32.       # hasJoined 阶段是否向 Yggdrasil 账户验证服务器传递用户 IP 信息,如果存在。
  33.       # 默认值 'false'
  34.       passIp: false

  35.       # 设置 url 节点 {passIpContent} 变量内容,
  36.       # 其中,变量 {ip} 为所获取到的 IP 信息。
  37.       # 仅当 passIp 节点为 true 时此节点有效。
  38.       # 请求的 URL 对大小写敏感,设置需谨慎!
  39.       # 请留意字符串拼接的特殊值 '&' 和 ', '
  40.       # 一些例子:
  41.       #      GET: '&ip={ip}'
  42.       #      POST: ', "ip":"{ip}"'
  43.       # 默认值 '&ip={ip}'
  44.       passIpContent: "&ip={ip}"

  45.       # 设置 post 的请求内容。
  46.       # 其中 POST 请求中的占位变量 {username} 表示 username,占位变量 {serverId} 表示 serverId,
  47.       #        占位变量 {passIpContent} 表示 passIpContent 节点所设置的内容。
  48.       # 请求的 URL 对大小写敏感,设置需谨慎!
  49.       # 一些例子:
  50.       #        '{"username":"{username}", "serverId":"{serverId}"{passIpContent}}'
  51.       #        '{"username":"{username}", "serverId":"{serverId}"}'
  52.       # 默认值 '{"username":"{username}", "serverId":"{serverId}"}'
  53.       postContent: '{"username":"{username}", "serverId":"{serverId}"}'

  54.     # 设置玩家首次登入后游戏内的 UUID 生成规则
  55.     # 目前只支持以下值:
  56.     #   DEFAULT   - 使用 Yggdrasil 账户证服务器提供的在线 UUID
  57.     #   OFFLINE   - 自动生成离线 UUID
  58.     #   RANDOM    - 随机 UUID
  59.     # 请谨慎设置和修改此节点,避免增加日后维护的心智负担。
  60.     # 为避免触发 Paper 端的某些机制,强烈建议此值为 DEFAULT
  61.     # 默认值 'DEFAULT'
  62.     convUuid: DEFAULT

  63.     # 当玩家首次登入时分配到的 UUID 已被使用,自动更正到随机的 UUID。
  64.     # 请尽量保持此值为 true ,除非您了解后果是什么。
  65.     # 默认值 'true'
  66.     convRepeat: true

  67.     # 玩家允许设置的用户名正则。
  68.     # 若不匹配将会拒绝当前玩家的登入请求
  69.     # 如果此值留空或未设置,则应用根节点下 'nameAllowedRegular' 节点值。
  70.     # 默认值 ''
  71.     nameAllowedRegular: ''

  72.     # 是否为当前验证服务器单独开启白名单。
  73.     # 当全局白名单为 true 时,此节点强制为 true。
  74.     # 默认值: false
  75.     whitelist: false

  76.     # 设置占线登入机制,登入时游戏内存在有相同游戏内 UUID 的玩家时
  77.     # 若为 false 将把游戏内玩家踢出,允许验证中的玩家登入(原版默认)
  78.     # 若为 true 则拒绝当前的登入请求
  79.     # 默认值: false
  80.     refuseRepeatedLogin: false

  81.     # 验证错误重试次数
  82.     # 默认值: 1
  83.     authRetry: 1

  84.     # 绝对的ID使用权限
  85.     # 若为 'true', 则验证中的玩家将会跳过重名验证检查并且强制占有当前ID。
  86.     # 默认值 'false'
  87.     safeId: false

  88.     # 皮肤修复规则,用来解决不同 Yggdrasil 账户验证服务器下的皮肤不可见问题。
  89.     #    比如使用 Minecraft 原版验证服务器的玩家无法看到使用第三方外置验证登入玩家的皮肤。
  90.     # 目前只支持设置以下值:
  91.     #   OFF       - 关闭这个功能
  92.     #   LOGIN     - 占用登入时间进行皮肤修复操作(修复时间过长会导致登入超时)
  93.     #   ASYNC     - 登入后修复(修复成功后需要重新连接服务器)
  94.     # 系统将会自动过滤掉皮肤源域名为 '*.minecraft.net' 的情况
  95.     # 皮肤修复服务器来自 'mineskin.org'
  96.     # 默认值 'OFF'
  97.     skinRestorer: OFF

  98.     # 皮肤修复错误重试次数
  99.     # 默认值: 2
  100.     skinRestorerRetry: 2
复制代码


例子:
  • 添加 Minecraft 原版验证服务器

    1. official:
    2.   name: "正版"
    3.   body:
    4.     url: "https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={serverId}{passIpContent}"
    复制代码

  • 添加 Blessing Skin 类型验证服务器

    1. blessingSkin:
    2.   name: "Blessing Skin"
    3.   body:

    4.       # 假设当前 Blessing Skin 的 Yggdrasil api 地址为 {url}
    5.       url: "{url}/sessionserver/session/minecraft/hasJoined?username={username}&serverId={serverId}{passIpContent}"
    复制代码

              
  • 添加 统一通行证 账户验证服务器

    1. nide8:
    2.   name: "统一通行证"
    3.   body:

    4.       # 假设当前服务器 UID 为 {uid}
    5.       url: "https://auth2.nide8.com:233/{uid}/sessionserver/session/minecraft/hasJoined?username={username}&serverId={serverId}{passIpContent}"
    复制代码


    | 命令和权限

    命令权限简介
    /multilogin reloadcommand.multilogin.reload重新加载配置文件
    /whitelist add <name|uuid>command.multilogin.whitelist.add将 target 添加到白名单中
    /whitelist remove <name|uuid>command.multilogin.whitelist.remove移除 target 的白名单
    /whitelist listcommand.multilogin.whitelist.list获得白名单列表


    | 下载地址



    请前往 GitHub

    本插件所用所有代码均为原创,不存在借用/抄袭等行为


    禁止商业使用违反GPLv3许可证!


    禁止对源码进行二次打包发布!



    | 更新日志

    (点击展开文字)


  • 本帖排版使用了Material Design帖子主题规范中的排版

    评分

    参与人数 1人气 +80 金币 +100 点数 +1 收起 理由
    缇亚祢 + 80 + 100 + 1 原创作品,必须支持!

    查看全部评分

    92

    积分

    106

    金币

    1

    点数

    Lv.4

    Rank: 4Rank: 4Rank: 4Rank: 4

    积分
    92
     楼主| 发表于 2021-10-18 12:06:27 | 显示全部楼层
    MultiLogin v1.0-RC.6

    提升 Bukkit 端获取变量性能
    兼容CatServer
    中文ID支持
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    手机版|小黑屋|格兰蒂协会

    GMT+8, 2021-10-28 08:48

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表