Bedrock Edition Authentication
Minecraft: Bedrock Edition implements a certificate chain authentication protocol based on JSON Web Tokens (JWT) cryptographically anchored to Microsoft / Xbox Live root public keys.
Authentication handling is powered by the pumpkin-auth crate and processed during the Bedrock login handshake in crates/pumpkin/src/net/bedrock/login/.
The Handshake Flow
When a Bedrock client initiates connection, it sends an SLogin packet containing the client's protocol version, an Identity Chain, and Client Data:
- Token Acquisition: The Bedrock client signs into Xbox Live, obtaining a chained JSON Web Token (JWT) certificate signed by Microsoft's CA.
- Login Transmission: The client packages this identity chain alongside a separate
ClientDataJWT intoSLogin. - Chain Validation: Pumpkin walks the certificate chain, verifying each token's signature against Mojang's public root keys and extracting the player's Xbox User ID (XUID), Gamertag, and ephemeral session public key.
- Hardware Verification: Pumpkin verifies the
ClientDatapayload using the client's ephemeral public key, extracting geometry, skins, and device OS telemetry. - Session Authorization: Once validated, Pumpkin emits
CPlayStatus(Login Success) and progresses to resource pack negotiation.
Token Payloads
1. Identity Chain (Chain)
An array of JWT tokens forming an unbroken chain of trust:
- Root Token: Cryptographically signed by Mojang's official public root certificate authority.
- Intermediate Tokens: Issued by Xbox Live services, verifying the player's Xbox Live User ID (XUID), gamertag, and generating an ephemeral ECDSA public key for the session.
- Claims: Includes
extraDatawithdisplayName,identity(UUID),XUID, andtitleId.
2. Client Data (ClientData)
A separate JWT signed with the client's ephemeral private key corresponding to the public key in the identity chain:
- Hardware & Environment:
DeviceOS,DeviceModel,CurrentInputMode,DefaultInputMode,ClientRandomId. - Game Version:
GameVersionstring. - Player Cosmetics: Full skin texture bitmaps, cape data, geometry names, and persona definitions.
Verification in pumpkin-auth
Pumpkin verifies token signatures using NIST P-384 ECDSA cryptography:
rust
// In crates/pumpkin/src/net/bedrock/login/mod.rs
match AuthPayload::verify(&jwt_payload) {
Ok(profile) => {
// Successfully verified against Mojang public keys
info!("Authenticated Bedrock player: {} (XUID: {})", profile.name, profile.xuid);
}
Err(LoginError::ChainValidationFailed(err)) => {
warn!("Bedrock JWT chain validation failed: {err}");
self.try_kick(DisconnectReason::Kicked, "Authentication failed".into());
}
Err(LoginError::SelfSignedNotAllowed) => {
warn!("Rejected unauthenticated self-signed Bedrock client");
self.try_kick(DisconnectReason::Kicked, "Server enforces Xbox Live authentication".into());
}
}Online vs. Offline Mode
- Online Mode (
online_mode = trueinpumpkin.toml): The chain must successfully validate against Mojang's public keys. Self-signed or unsigned tokens are immediately rejected. - Offline Mode (
online_mode = false): Pumpkin accepts self-signed client chains, generating offline UUIDs while extracting cosmetic skins and device metadata.