Authentication(Chinese): Difference between revisions

From wiki.vg
Jump to navigation Jump to search
imported>Lzs
imported>TkTech
(TkTech moved page Authentication(Chinese) to User:Lzs/Authentication(Chinese): Abandoned incomplete page, moving back to the originating user's namespace.)
 
(10 intermediate revisions by 2 users not shown)
Line 1: Line 1:
(Is being translated into Chinese)
#REDIRECT [[User:Lzs/Authentication(Chinese)]]
 
在Minecraft 1.6 中引入了一种名为 '''Yggdrasil''' 的新身份验证方案,完全取代了[[Legacy Authentication|旧版认证系统]]。Mojang的其他游戏《Scrolls》也使用这种认证方式。 Mojang 表示 [https://twitter.com/KrisJelbring/status/453573406341206016 此身份验证系统应该被使用在每一个自定义登录上],但 [https://twitter.com/KrisJelbring/status/461390585086361600 绝不应从用户那里收集证书]。
 
== 请求格式 ==
 
所有请求是由以下服务器发往 Yggdrasil:
 
https://authserver.mojang.com
 
进一步说,他们预计将满足以下规则:
 
* 是 <code>POST</code> 请求
* Have the <code>Content-Type</code> header set to <code>application/json</code>
* Contain a [[wikipedia:JSON|JSON]]-encoded dictionary as payload
 
如果请求成功服务器将响应:
 
* 状态码 <code>200</code>
* A [[wikipedia:JSON|JSON]]-encoded dictionary according to the specifications below
 
If however a request fails, the server will respond with:
 
* An appropriate, non-200 [[wikipedia:List of HTTP status codes|HTTP status code]]
* 一个 [[wikipedia:JSON|JSON]]-编码字典格式如下:
 
<syntaxhighlight lang="javascript">
{
    "error": "Short description of the error",
    "errorMessage": "Longer description which can be shown to the user",
    "cause": "Cause of the error" // 可选
}
</syntaxhighlight>
 
== 错误 ==
 
这些都是一些可能遇到的错误:
 
{| class="wikitable"
|-
! 错误
! 原因
! 错误提示
! 注释
|-
| <code>Method Not Allowed</code>
|
| 请求中指定的方法是不允许的,因为资源标识来自URI请求。
| 收到POST请求以外的数据。
|-
| <code>Not Found</code>
|
| 服务器并没有发现任何匹配此请求的URI。
| 被呼叫的端点不存在。
|-
| <code>ForbiddenOperationException</code>
| <code>UserMigratedException</code>
| 无效的证书。帐户迁移,使用电子邮件作为用户名。
|
|-
| <code>ForbiddenOperationException</code>
|
| 无效的证书。无效的用户名或密码。
|
|-
| <code>ForbiddenOperationException</code>
|
| 无效的证书。
| 此用户名近期尝试太多次登录(查看<code>/authenticate</code>)。注意,用户名和密码可能仍然是有效的!
|-
| <code>ForbiddenOperationException</code>
|
| 无效的令牌。
| <code>accessToken</code> 是无效的。
|-
| <code>IllegalArgumentException</code>
|
| 访问令牌(Access token)已有一个指定的配置文件。
| 选择配置文件还未实现。
|-
| <code>IllegalArgumentException</code>
|
| 证书是空的。
| 用户名/密码未提交。
|-
| <code>Unsupported Media Type</code>
|
| 此服务器拒绝服务请求,因为实体请求的格式不受 请求的资源的请求的方法 支持。(翻译水平不足,无法理解请阅读英文原文)
| 数据未被应用程序提交/json
|}
 
== 身份验证 ==
 
使用他的密码对用户进行身份验证。
 
=== 端点 ===
 
/authenticate
 
=== 有效载荷 ===
 
<syntaxhighlight lang="javascript">
{
    "agent": {                              // 默认为 Minecraft
        "name": "Minecraft",                // 适用于 Mojang 的其他游戏《Scrolls》, 应使用"Scrolls"
        "version": 1                        // 这个数字可能会增加
                                            // 根据将来的客户端改变
    },
    "username": "mojang account name",      // 可以是一个电子邮件地址或玩家的名字
                                            // 对于迁移的帐户
    "password": "mojang account password",
    "clientToken": "client identifier",    // 可选
    "requestUser": true                    // 可选的,默认值:false;true将用户对象添加到响应中
}
</syntaxhighlight>
 
此 <code>clientToken</code> 应该是一个随机生成的标识符并且对于每个请求必须是相同的。在首次运行启动器时生成一个随机的(版本4)UUID 并保存它,在后续请求中重复使用它。假如它丢失了,服务器将基于Java的  [http://docs.oracle.com/javase/7/docs/api/java/util/UUID.html#toString() <code>UUID.toString()</code>]生成一个随机的令牌并应被客户端储存。然而这也将使该用户的所有客户端先前获得的 <code>accessToken</code> 失效。
 
=== 响应 ===
 
<syntaxhighlight lang="javascript">
{
    "accessToken": "random access token",      // 十六进制
    "clientToken": "client identifier",        // 与接收到的相同
    "availableProfiles": [                     // 只有当代理字段被接收时才存在
        {
            "id": "profile identifier",        // 十六进制
            "name": "player name",
            "legacy": true or false            // 实际上, 如果是true,这个字段只出现在响应中。默认为false.
        }
    ],
    "selectedProfile": {                      // 只有当代理字段被接收时才存在
        "id": "uuid without dashes",
        "name": "player name",
        "legacy": true or false
    },
    "user": {                                  // 只出现在请求有效载荷中requestUser为真时
        "id": "user identifier",              // 十六进制
        "properties": [
            {
                "name": "preferredLanguage",  // 可能不适用于所有帐户
                "value": "en"                  // 使用ISO 639-1标准,中文用zh表示
            },
            {
                "name": "twitch_access_token", // 只有当一个twitch 帐户被关联时才存在 (查看https://account.mojang.com/me/settings)
                "value": "twitch oauth token"  // OAuth 2.0 令牌; 字母数字混合; e.g. https://api.twitch.tv/kraken?oauth_token=[...]
                                              // 这里记录了Twitch的API: https://github.com/justintv/Twitch-API
            }
        ]
    }
}
</syntaxhighlight>
 
'''注意:''' 如果用户希望呆在他们的电脑上登录,强烈建议将接收到的 <code>accessToken</code> 代替密码本身。
 
目前每个帐户只能拥有一个配置文件,不过在未来的计划中每个账户可以拥有多个配置文件。 如果用户没有附加Minecraft许可证的情况下试图登录到一个有效的Mojang账户,身份验证将会成功,但响应不会包含 <code>selectedProfile</code> 字段,并且 <code>availableProfiles</code> 数组将为空。
 
在某些情况下,观察到Mojang对遗留帐户的刷新尝试失败时返回一个<code>null</code>。目前还不清楚空响应的实际错误是什么并且非常罕见。但是,实现上应该警惕响应的空输出。
 
这个端点是频率限制;
: 多个 <code>/authenticate</code> 在很短的时间内对相同账户的请求 (在短时间内考虑 3 个请求),即使有正确的密码, 最终将导致一个 <code>Invalid credentials.</code> 响应。这一错误在几秒钟后就会消失。
 
== Refresh ==
 
Refreshes a valid <code>accessToken</code>. It can be used to keep a user logged in between gaming sessions and is preferred over storing the user's password in a file (see [[lastlogin]]).
 
=== 端点 ===
 
/refresh
 
=== 有效载荷 ===
<syntaxhighlight lang="javascript">
{
    "accessToken": "valid accessToken",
    "clientToken": "client identifier",  // 这需要与最初获得的accessToken相同
                                        // 
    "selectedProfile": {                // 可选的;发送它将导致错误
        "id": "profile identifier",      // 十六进制
        "name": "player name"
    },
    "requestUser": true                  // 可选;默认值:false;true将用户对象添加到响应中
}
</syntaxhighlight>
 
注意: 所提供的 <code>accessToken</code> 无效。
 
=== Response ===
 
<syntaxhighlight lang="javascript">
{
    "accessToken": "random access token",      // hexadecimal
    "clientToken": "client identifier",        // identical to the one received
    "selectedProfile": {
        "id": "profile identifier",            // hexadecimal
        "name": "player name"
    },
    "user": {                                  // only present if requestUser was true in the request payload
        "id": "user identifier",              // hexadecimal
        "properties": [
            {
                "name": "preferredLanguage",  // might not be present for all accounts
                "value": "en"                  // ISO 639-1?
            },
            {
                "name": "twitch_access_token", // only present if a twitch account is associated (see https://account.mojang.com/me/settings)
                "value": "twitch oauth token"  // OAuth 2.0 Token; alphanumerical; e.g. https://api.twitch.tv/kraken?oauth_token=[...]
                                              // the Twitch API is documented here: https://github.com/justintv/Twitch-API
            }
        ]
    }
}
</syntaxhighlight>
 
== 验证 ==
 
检查 <code>accessToken</code> 是否可以使用Minecraft服务器进行身份验证。Minecraft启动器(从版本1.6.13开始) 在启动时调用此端点,以验证其保存的令牌仍然可用,如果返回错误,则调用 <code>/refresh</code>。
 
注意,<code>accessToken</code> 可能无法与Minecraft服务器进行身份验证,但是对于 <code>/refresh</code> 来说还是不错的。这主要发生在使用另一个客户端时(e.g. 在另一台电脑上玩Minecraft)。似乎只有最近获得的给定帐户的 <code>accessToken</code>才能被可靠地用于身份验证。(倒数第二的令牌似乎也仍然有效,但是不要依赖它)。
 
在有或没有 <code>clientToken</code> 的情况下<code>/validate</code> 都可能被调用。 如果提供了
<code>clientToken</code>,应该匹配一个用于获取 <code>accessToken</code>。Minecraft启动器发送一个<code>clientToken</code> 到 <code>/validate</code>。(翻译水平不足,无法理解请阅读英文原文)
 
=== 端点 ===
 
/validate
 
=== 有效载荷 ===
 
<syntaxhighlight lang="javascript">
{
    "accessToken": "valid accessToken",
    "clientToken": "associated clientToken" // 可选,见上图
}
</syntaxhighlight>
 
=== 响应 ===
 
如果成功,则返回一个空的有效载荷 (<code>204 No Content</code>) , 否则将显示状态为
<code>403 Forbidden</code> 的JSON错误。
 
== 注销 ==
 
无效的 <code>accessToken</code> 使用一个帐户的用户名和密码
 
=== 端点 ===
 
/signout
 
=== 有效载荷 ===
 
<syntaxhighlight lang="javascript">
{
    "username": "mojang account name",
    "password": "mojang account password"
}
</syntaxhighlight>
 
=== 响应 ===
 
如果成功返回一个空的有效载荷。
 
== 无效 ==
 
无效的 <code>accessToken</code> 使用客户端/访问令牌。
 
=== 端点 ===
 
/invalidate
 
=== 有效载荷 ===
 
<syntaxhighlight lang="javascript">
{
    "accessToken": "valid accessToken",
    "clientToken": "client identifier"  // 这需要与最初获得的accessToken相同
                                        //
}
</syntaxhighlight>
 
=== 响应 ===
 
如果成功返回一个空的有效载荷。
 
== 加入一个服务器 ==
 
查看[[Protocol Encryption#Authentication]]
 
[[Category:Protocol Details]]
[[Category:Minecraft Modern]]

Latest revision as of 15:56, 14 March 2019