Lxn-Chan!

(~ ̄▽ ̄)→))* ̄▽ ̄*)o

针对国内网络环境对Minecraft的认证服务的污染问题做出的代理解决方案,常见的报错包括:Authentication servers are down. Please try again later, sorry![10:20:18] [User Authenticator #2/ERROR]: Couldn't verify username because servers are unavailable等。

基本原理与解决方案

说人话就是在国内Mojang和托管在Azure上的部分服务被墙了导致国内大概率访问不到这些API,于是通过Cloudflare Workers进行代理。这里假设已经配置好了,域名为minecraft-service.lxn.worker.dev,相关的worker.js放在文章末尾了。

用法

示例:

1
2
3
4
5
6
java -Xmx20G \
-Dminecraft.api.auth.host=https://minecraft-service.lxn.worker.dev/auth \
-Dminecraft.api.account.host=https://minecraft-service.lxn.worker.dev/account \
-Dminecraft.api.session.host=https://minecraft-service.lxn.worker.dev/session \
-Dminecraft.api.services.host=https://minecraft-service.lxn.worker.dev/service \
-jar fabric-server-mc.1.21.1-loader.0.18.4-launcher.1.1.1.jar nogui

注意-D指定的参数一定要在-jar之前否则不生效或者传不到。

Worker.js

该js基于 Fallen_Breath的动态 改进而来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

const PATH_MAP = {
'/auth': 'authserver.mojang.com',
'/account': 'api.mojang.com',
'/session': 'sessionserver.mojang.com',
'/services': 'api.minecraftservices.com',
'/service': 'api.minecraftservices.com',
'/minecraft': 'api.minecraftservices.com'
}

async function handleRequest(request) {
let url = new URL(request.url)

if (url.pathname.startsWith('/mcauthproxy/')) {
url.pathname = url.pathname.replace('/mcauthproxy', '')
}

if (url.pathname === '/' || url.pathname === '' || url.pathname === '/favicon.ico') {
return new Response(
'Minecraft Proxy by lxnchan.cn, Service OK.',
{ status: 200 }
)
}

let isMatched = false

for (let prefix in PATH_MAP) {
if (
url.pathname === prefix ||
url.pathname.startsWith(prefix + '/')
) {
url.hostname = PATH_MAP[prefix]
url.pathname = url.pathname.replace(prefix, '')
isMatched = true
break
}
}

if (!isMatched) {
return new Response(
'API Not Found, path: ' + url.pathname,
{ status: 404 }
)
}

let headers = new Headers(request.headers)
headers.set('Host', url.hostname)

console.log(`Proxy ${request.url} -> ${url.toString()}`)

let modifiedRequest = new Request(url.toString(), {
method: request.method,
headers: headers,
body: ['GET', 'HEAD'].includes(request.method)
? undefined
: request.body
})

let response = await fetch(modifiedRequest)

return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: response.headers
})
}

 简单说两句



联系站长 | 服务状态 | 友情链接

备案号:辽ICP备19013963号

津公网安备12011602300394号

中国互联网违法和不良信息举报中心

架构版本号:8.2.1 | 本站已全面支持IPv6

正在载入运行数据(1/2)请稍后...
正在载入运行数据(2/2)请稍后...

O to die advancing on!

Copyright 2024 LingXuanNing, All rights reserved.