Skip to content

[proposal] Yggdrasil Oauth Specification #286

Description

@pingguomc

[提案] Yggdrasil Oauth 规范

经过对 Yggdrasil Connect 提案 #268 未获通过经验的总结,结合当下 Minecraft 玩家的实际需求,我决定重新发起提案。

Important

本提案并不要求强制实施。

概述

LittleSkin | 通过 OAuth 访问 Yggdrasil API 已经规定了大部分内容,此处直接引用。

所谓 Oauth 规范,实际上是对 Yggdrasil 登录 API 的更改,其他部分 API 保持不变。

更改的内容主要用于取代 Yggdrasil服务端规范 | 登录 API
大体上就是换了个方式获得 accessToken,来增强安全性、可管理性和便捷性。
因此,对于原有的其他 API 对接较为简易。


下面是 Oauth 2.0 基本流程。

(A)客户端(Client)向资源所有者(Resource Owner)请求资源授权。授权请求可以直接向资源所有者(Resource Owner)发起,不过最好是通过授权服务器(Authorization Server)间接发起。
(B) 客户端(Client)得到资源所有者(Resoure Owner)的授权,这通常是一个凭据;授权的形式和凭据可以有不同的类型。RFC 6749 定义了四种主要的授权类型(下文进一步介绍)
(C)客户端(Client)向授权服务器(Authorization Server)出示授权(来自Resource Owenr的)凭据进行身份认证;并申请用于访问资源授权的访问令牌(Access Token)
(D) 授权服务器(Authorization Server)对客户端(Client)进行身份验证并验证授权授予,如果通过验证,则颁发访问令牌(Access Token)。
(E)客户端(Client)通过向资源服务器(Resource Server)发起令牌(Access Token)验证,请求被保护的资源。
(F)资源服务器(Resource Server)验证访问令牌(Access Token);如果通过认证,则返回请求的资源。
—— 深入理解OAuth 2.0:原理、流程与实践


这里有两种情况,一是 启动器 作为 客户端 行驶流程,二是 Yggdrasil服务端 并不保存用户数据,而是通过第三方(如微软)来登录。

对于第一种情况,要求 启动器Yggdrasil服务端 完成所有部分的代码,建议参考 LittleSkin | 通过 OAuth 访问 Yggdrasil API 来制定规范。

对于第二种情况,由于鉴权登录等流程均由 Yggdrasil服务端 执行,因此启动器只需要提供直接填写 accessToken 的登录方式即可。

我个人认为这两种情况的规范可以一同制定,以便各位开发者选择。

附言

我个人认为,可以选择重启 #268 ,并将我的提案作为副本关闭,或者根据我的提案进行更改并实施。

Important

这只是一个提案/建议,不包括具体的实现方案。更具体的内容将发布在评论的第一个隐藏内容。

  1. 启动器 自行选择是否实现,并且我建议保留原有的身份验证机制,让用户选择。
  2. Yggdrasil服务端 自行选择是否实现,但我不建议开发者继续开发和维护原有的身份验证机制。
  3. Minecraft服务端 无需更改。

必要性

authlib-injector 外置登录利用了 Minecraft 自带的 Yggdrasil 鉴权认证系统,已经成为了多人游戏中用户身份认证的主流手段之一。

但传统的 Yggdrasil API 仍然存在设计上的缺陷。Yggdrasil API 的 登录 API 需要由启动器直接处理用户输入的账号和密码,并将其在 HTTP 请求中明文发送,这给了恶意程序盗取用户机密信息的可乘之机;且该 API 在设计上几乎没有考虑到二步验证,无法良好地保障用户的资产安全。

为解决这一问题,Mojang 在 2020 年 10 月宣布,将原先的 Mojang 账号体系迁移至 Microsoft 账号,以在全平台上提供统一的身份认证体验,并通过 Microsoft 账号体系提供的多因素认证功能保障用户账号安全。这一迁移行动已于 2023 年 12 月完成。

那,第三方 Yggdrasil 认证服务器呢?

作为事实上的国内最大第三方 Yggdrasil 验证服务器,长期以来,LittleSkin 饱受不同启动器上身份认证体验不统一导致的用户体验低下的问题的折磨(一个典型的例子是 PCL,其在登录失败时不会向用户展示验证服务器返回的错误详情,而是显示一个其推测的所有可能原因的文字模板,这一问题直至 PCL 2.8.6 才得以解决);也因为传统 Yggdrasil API 的登录 API 不支持「直接输入用户名和密码」以外的身份认证方式,LittleSkin 一直无法实装用户体验良好的二步验证和社交网站登录功能。

——LittleSkin 用户使用手册

事实上, Oauth 已经被实现并使用,而没有规范几乎必定会导致 服务端、启动器 之间 不通用、不适配的问题出现。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions