diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MicrosoftAccount.kt b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MicrosoftAccount.kt index f339ce2..6ae74c4 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MicrosoftAccount.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MicrosoftAccount.kt @@ -14,7 +14,7 @@ class MicrosoftAccount : MinecraftAccount(AccountType.MICROSOFT) { private var accessToken = "" private var refreshToken = "" - private var authMethod = AuthMethod.MICROSOFT + private var authMethod = AuthMethod.MINECRAFT_PC override fun login(): Pair { if (profile?.uuid == null || accessToken.isEmpty()) { @@ -187,10 +187,21 @@ class MicrosoftAccount : MinecraftAccount(AccountType.MICROSOFT) { /** * Create a new [MicrosoftAccount] from OAuth */ - fun buildFromOpenBrowser(handler: OAuthHandler, authMethod: AuthMethod = AuthMethod.AZURE_APP): OAuthServer { + fun buildFromOpenBrowser(handler: OAuthHandler, authMethod: AuthMethod = AuthMethod.LIQUIDBOUNCE): OAuthServer { return OAuthServer(handler, authMethod).also { it.start() } } + /** + * Create a new [MicrosoftAccount] from Microsoft Refresh token + */ + fun buildFromRefreshToken(token: String): MicrosoftAccount { + return MicrosoftAccount().also { + it.authMethod = AuthMethod.MINECRAFT_PC + it.refreshToken = token + it.refresh() + } + } + fun replaceKeys(method: AuthMethod, string: String) = string.replace("", method.clientId) .replace("", method.redirectUri) @@ -199,18 +210,53 @@ class MicrosoftAccount : MinecraftAccount(AccountType.MICROSOFT) { enum class AuthMethod(val clientId: String, val redirectUri: String, val scope: String, val rpsTicketRule: String) { - MICROSOFT( + /** + * Official Minecraft auth method. + * It is NOT recommended to be used for production software, however, + * we might need it for testing purposes. + * + * @see https://dreta.dev/blog/2023/08/15/how-minecraft-launchers-work/ + */ + MINECRAFT_PC( + "00000000402B5328", + "https://login.live.com/oauth20_desktop.srf", + "service::user.auth.xboxlive.com::MBI_SSL", + "" + ), + + /** + * Official Minecraft Nintendo Switch auth method. + * It is NOT recommended to be used for production software, however, + *we might need it for testing purposes. + * + * @see https://docs.rs/crate/azalea-auth/latest/source/src/auth.rs#285-286 + */ + MINECRAFT_NINTENDO_SWITCH( "00000000441cc96b", "https://login.live.com/oauth20_desktop.srf", "service::user.auth.xboxlive.com::MBI_SSL", "" ), + + /** + * We registered our own Azure application for LiquidBounce. + * This does not allow email and password authentication; however, + * it is more secure since it forces users to use OAuth. + */ + LIQUIDBOUNCE( + "0add8caf-2cc6-4546-b798-c3d171217dd9", + "http://localhost:${oauthPort}/login", + "XboxLive.signin%20offline_access", + "d=" + ), + + @Deprecated("Replaced by LIQUIDBOUNCE", ReplaceWith("LIQUIDBOUNCE")) AZURE_APP( "0add8caf-2cc6-4546-b798-c3d171217dd9", "http://localhost:${oauthPort}/login", "XboxLive.signin%20offline_access", "d=" - ) + ); } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MinecraftAccount.kt b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MinecraftAccount.kt index 9bcc2fc..e85e3c1 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MinecraftAccount.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/account/MinecraftAccount.kt @@ -177,7 +177,7 @@ sealed class MinecraftAccount(val type: AccountType) { fun fromName(name: String): MinecraftAccount { return if (name.startsWith("ms@")) { val realName = name.substring(3) - MicrosoftAccount.buildFromAuthCode(realName, MicrosoftAccount.AuthMethod.MICROSOFT) + MicrosoftAccount.buildFromAuthCode(realName, MicrosoftAccount.AuthMethod.MINECRAFT_NINTENDO_SWITCH) } else { CrackedAccount(username = name) } diff --git a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/compat/OAuthServer.kt b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/compat/OAuthServer.kt index 455bbee..8de6f92 100644 --- a/src/main/kotlin/net/ccbluex/liquidbounce/authlib/compat/OAuthServer.kt +++ b/src/main/kotlin/net/ccbluex/liquidbounce/authlib/compat/OAuthServer.kt @@ -18,7 +18,7 @@ import java.util.concurrent.Executors */ class OAuthServer( val handler: MicrosoftAccount.OAuthHandler, - private val authMethod: MicrosoftAccount.AuthMethod = MicrosoftAccount.AuthMethod.AZURE_APP, + private val authMethod: MicrosoftAccount.AuthMethod = MicrosoftAccount.AuthMethod.LIQUIDBOUNCE, private val httpServer: HttpServer = HttpServer.create(InetSocketAddress("localhost", oauthPort), 0), private val context: String = "/login" ) { diff --git a/src/test/kotlin/net/ccbluex/liquidbounce/authlib/AuthLibTests.kt b/src/test/kotlin/net/ccbluex/liquidbounce/authlib/AuthLibTests.kt index d1e352d..86fc759 100644 --- a/src/test/kotlin/net/ccbluex/liquidbounce/authlib/AuthLibTests.kt +++ b/src/test/kotlin/net/ccbluex/liquidbounce/authlib/AuthLibTests.kt @@ -1,12 +1,9 @@ package net.ccbluex.liquidbounce.authlib import com.google.gson.JsonObject -import net.ccbluex.liquidbounce.authlib.account.AlteningAccount import net.ccbluex.liquidbounce.authlib.account.MicrosoftAccount import net.ccbluex.liquidbounce.authlib.account.MinecraftAccount -import net.ccbluex.liquidbounce.authlib.account.SessionAccount import net.ccbluex.liquidbounce.authlib.bantracker.Ban -import net.ccbluex.liquidbounce.authlib.manage.AccountSerializer import net.ccbluex.liquidbounce.authlib.utils.set import net.ccbluex.liquidbounce.authlib.utils.toJsonString import org.junit.jupiter.api.Assertions.assertEquals @@ -72,7 +69,7 @@ class AuthLibTests { override fun authError(error: String) { println("Auth error: $error") } - }, MicrosoftAccount.AuthMethod.AZURE_APP) + }, MicrosoftAccount.AuthMethod.LIQUIDBOUNCE) assertTrue(true) }