Người chơi và đăng nhập
Tài khoản khách vẫn giữ nguyên sau khi khởi động lại, tên hiển thị, và liên kết tài khoản khách với email hoặc Google.
Chú thích trong mã và tên API được giữ nguyên tiếng Anh để khớp với SDK.
Đăng nhập khách#
Gọi hàm này một lần khi khởi động. Hàm khôi phục phiên đã lưu (làm mới khi cần) hoặc tạo một tài khoản khách mới, nhờ đó cùng một người chơi vẫn giữ được tiến trình.
var signIn = await Majacloud.Auth.SignInAnonymouslyAsync();
if (signIn.Ok)
{
var player = signIn.Value;
Debug.Log(player.PlayerId + " " + player.DisplayName + " guest: " + player.IsGuest);
}var signed_in := await Majacloud.auth.sign_in_anonymously()
if signed_in.ok:
var player: Dictionary = signed_in.value
print(player.player_id, " ", player.display_name, " ", player.auth_type)const signIn = await mc.auth.signInAnonymously();
if (signIn.ok) {
const player = signIn.value;
console.log(player.player_id, player.display_name, player.auth_type);
}curl -X POST https://majacloud.majanite.com/v1/auth/guest -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"device_id": "install-7f2c"}'
# Before the access token expires (1 hour), rotate the session:
curl -X POST https://majacloud.majanite.com/v1/auth/refresh -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"refresh_token": "<refresh_token>"}'Tên hiển thị#
Tài khoản khách nhận một tên được tạo tự động, chẳng hạn Guest 4821. Người chơi có thể tự chọn tên; bảng xếp hạng sẽ hiển thị tên này.
var renamed = await Majacloud.Auth.SetDisplayNameAsync("Nova");
if (!renamed.Ok) Debug.Log(renamed.Error.Message); // e.g. Validation: too longvar renamed := await Majacloud.auth.set_display_name("Nova")
if not renamed.ok:
print(renamed.message) # e.g. validation: too longconst renamed = await mc.auth.setDisplayName('Nova');
if (!renamed.ok) console.log(renamed.error.message); // e.g. validation: too longcurl -X PATCH https://majacloud.majanite.com/v1/players/me -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"display_name": "Nova"}'Liên kết với email hoặc Google#
Liên kết sẽ mở một trang web bảo mật trên máy chủ MAJACLOUD của bạn, nơi người chơi đăng nhập hoặc đăng ký bằng email và mật khẩu hoặc Google. Tiến trình của tài khoản khách (điểm số, bản lưu, ví) được chuyển sang tài khoản đó, và game nhận được phiên mới — trên bất kỳ thiết bị nào.
// Opens the sign-in page, waits for the player, then switches the session
var linked = await Majacloud.Auth.LinkAccountAsync(new MajacloudLinkOptions { ReturnUrl = "mygame://auth" });
if (linked.Ok) Debug.Log("Signed in as " + linked.Value.DisplayName);
// WebGL: browsers only open tabs from a click, so start first and open inside the handler
var flow = await Majacloud.Auth.StartLinkAsync(new MajacloudLinkOptions { OpenBrowser = false });
linkButton.onClick.AddListener(() => flow.Value.OpenInBrowser());
var result = await flow.Value.WaitForCompletionAsync();# Opens the sign-in page, waits for the player, then switches the session
var linked := await Majacloud.auth.link_account("mygame://auth")
if linked.ok:
print("Signed in as ", linked.value.display_name)
# Or step by step (e.g. to open the page from a button)
var started := await Majacloud.auth.start_link()
var flow: MajacloudLinkFlow = started.value
flow.open_in_browser()
var result := await flow.wait_for_completion()// Call it from a click handler: the browser only allows the new tab after a user gesture
document.querySelector('#link').addEventListener('click', async () => {
const linked = await mc.auth.linkAccount();
if (linked.ok) console.log('Signed in as ' + linked.value.display_name);
});# 1. Start (send the guest's Bearer token so its progress is merged)
curl -X POST https://majacloud.majanite.com/v1/auth/link/start -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" -d '{"code_challenge": "<base64url(sha256(verifier))>", "code_challenge_method": "S256"}'
# 2. Open auth_url for the player, then poll until status is "completed"
curl "https://majacloud.majanite.com/v1/auth/link/status?flow_id=<flow_id>&flow_token=<flow_token>" -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY"
# 3. Exchange for the new session
curl -X POST https://majacloud.majanite.com/v1/auth/link/exchange -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"flow_id": "<flow_id>", "exchange_code": "<exchange_code>", "code_verifier": "<verifier>"}'Cách liên kết hoạt động#
- SDK tạo một mã bí mật dùng một lần (PKCE) và bắt đầu luồng đăng nhập.
- Người chơi hoàn tất trên trang web; SDK thăm dò (poll) cho đến khi luồng hoàn tất.
- SDK dùng mã bí mật đó để đổi luồng lấy một phiên, nên liên kết có bị đánh cắp cũng vô dụng.
- Luồng hết hạn sau 15 phút (được gia hạn khi trang còn mở).
Quay lại game#
Nếu không có URL quay lại, trang sẽ nhắc người chơi tự quay lại game. Để đưa họ quay lại tự động, hãy thêm URL scheme tùy chỉnh của bạn (ví dụ mygame) trong Khóa API ▸ URL quay lại sau khi người chơi đăng nhập và truyền mygame://auth làm URL quay lại.
Sự kiện#
Xử lý khi người chơi thay đổi, đăng xuất hoặc khi phiên không thể làm mới được nữa:
Majacloud.Auth.PlayerChanged += player => nameLabel.text = player?.DisplayName;
Majacloud.Auth.SignedOut += () => ShowTitleScreen();
Majacloud.Auth.SessionExpired += () => ShowSignIn();Majacloud.auth.player_changed.connect(func(player): $NameLabel.text = player.get("display_name", ""))
Majacloud.auth.signed_out.connect(show_title_screen)
Majacloud.auth.session_expired.connect(show_sign_in)mc.auth.on('playerChanged', (player) => render(player));
mc.auth.on('signedOut', () => showTitleScreen());
mc.auth.on('sessionExpired', () => showSignIn());Đăng xuất#
Đăng xuất sẽ thu hồi phiên trên máy chủ và xóa phiên khỏi thiết bị. Lần đăng nhập tiếp theo sẽ tạo một tài khoản khách mới.
await Majacloud.Auth.SignOutAsync(); // revokes the session on the server
Majacloud.Auth.ClearLocalSession(); // or only forget it on this deviceawait Majacloud.auth.sign_out() # revokes the session on the server
Majacloud.auth.clear_local_session() # or only forget it on this deviceawait mc.auth.signOut(); // revokes the session on the server
mc.auth.clearLocalSession(); // or only forget it on this devicecurl -X POST https://majacloud.majanite.com/v1/auth/logout -H "X-Project-ID: $PROJECT_ID" -H "X-Client-Key: $CLIENT_KEY" \
-H "Content-Type: application/json" -d '{"refresh_token": "<refresh_token>"}'Đọc thông tin người chơi từ máy chủ#
Với khóa bí mật, máy chủ của bạn có thể đọc thông tin của bất kỳ người chơi nào, bao gồm email và số dư ví:
// Node.js, created with secretKey
const found = await admin.server.getPlayer('player_3f9c…');
if (found.ok) console.log(found.value.player.email, found.value.player.wallets);curl https://majacloud.majanite.com/v1/players/player_3f9c… \
-H "X-Project-ID: $PROJECT_ID" -H "X-Secret-Key: $SECRET_KEY"Trong bảng điều khiển#
Trang Người chơi liệt kê mọi người chơi cùng phương thức đăng nhập, điểm số, bản lưu và ví. Tại đó bạn có thể đổi tên hoặc vô hiệu hóa người chơi, đăng xuất họ khỏi mọi thiết bị, gửi liên kết đặt lại mật khẩu hoặc xóa họ.