From 67c87e629e38a61c22d71be14755fc5a3e607ba1 Mon Sep 17 00:00:00 2001 From: Codins <47649480+C0dins@users.noreply.github.com> Date: Tue, 16 Jan 2024 10:55:58 -0600 Subject: [PATCH 1/3] Added retrieveProfile param to loginWithCredentials Fixes issue with unable to login into minecraft accounts without a username set such as giftcard and gamepass accounts --- .../microsoft/MicrosoftAuthenticator.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java index f611075..76f0750 100644 --- a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java +++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java @@ -124,6 +124,39 @@ public MicrosoftAuthResult loginWithCredentials(String email, String password) t } } + public MicrosoftAuthResult loginWithCredentials(String email, String password, boolean retrieveProfile) throws MicrosoftAuthenticationException { + CookieHandler currentHandler = CookieHandler.getDefault(); + CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); + + Map params = new HashMap<>(); + params.put("login", email); + params.put("loginfmt", email); + params.put("passwd", password); + + HttpURLConnection result; + + try { + PreAuthData authData = preAuthRequest(); + params.put("PPFT", authData.getPPFT()); + + result = http.followRedirects(http.postForm(authData.getUrlPost(), params)); + } finally { + CookieHandler.setDefault(currentHandler); + } + + try { + return loginWithTokens(extractTokens(result.getURL().toString()),retrieveProfile); + } catch (MicrosoftAuthenticationException e) { + if (match("(identity/confirm)", http.readResponse(result)) != null) { + throw new MicrosoftAuthenticationException( + "User has enabled double-authentication or must allow sign-in on https://account.live.com/activity" + ); + } + + throw e; + } + } + /** * Logs in a player using a webview to display Microsoft login page. * This function blocks the current thread until the process is finished; this can cause your application to From 01091b7bcb71af49fa9c80a7e233217f21efbbdf Mon Sep 17 00:00:00 2001 From: Codins <47649480+C0dins@users.noreply.github.com> Date: Tue, 16 Jan 2024 11:08:01 -0600 Subject: [PATCH 2/3] Added documentation for new method Added javadocs for loginWithCredentials(String email, String password, boolean retrieveProfile) --- .../openauth/microsoft/MicrosoftAuthenticator.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java index 76f0750..bc28d52 100644 --- a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java +++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java @@ -124,6 +124,15 @@ public MicrosoftAuthResult loginWithCredentials(String email, String password) t } } + /** + * Logs in a player using its Microsoft account credentials and retrieves its access and xboxUserHash + * + * @param email Player Microsoft account e-mail + * @param password Player Microsoft account password + * @param retrieveProfile if you want to retrieve the minecraft profile + * @return The player's xbox profile with minecraft access token + * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point + */ public MicrosoftAuthResult loginWithCredentials(String email, String password, boolean retrieveProfile) throws MicrosoftAuthenticationException { CookieHandler currentHandler = CookieHandler.getDefault(); CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); From 69b68f4bb4a731f3ed2d1602273f114b4192df7c Mon Sep 17 00:00:00 2001 From: Codins Date: Tue, 16 Jan 2024 19:36:26 -0600 Subject: [PATCH 3/3] Added retrieveProfile param for loginWithRefreshToken --- .../microsoft/MicrosoftAuthenticator.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java index bc28d52..6616c7c 100644 --- a/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java +++ b/src/main/java/fr/litarvan/openauth/microsoft/MicrosoftAuthenticator.java @@ -226,6 +226,27 @@ public MicrosoftAuthResult loginWithRefreshToken(String refreshToken) throws Mic return loginWithTokens(new AuthTokens(response.getAccessToken(), response.getRefreshToken()),true); } + /** + * Logs in a player using a Microsoft account refresh token retrieved earlier. + * + * @param refreshToken Player Microsoft account refresh token + * @param retrieveProfile if you want to retrieve the minecraft profile + * @return The player's xbox profile with minecraft access token + * @throws MicrosoftAuthenticationException Thrown if one of the several HTTP requests failed at some point + */ + public MicrosoftAuthResult loginWithRefreshToken(String refreshToken, boolean retrieveProfile) throws MicrosoftAuthenticationException { + Map params = getLoginParams(); + params.put("refresh_token", refreshToken); + params.put("grant_type", "refresh_token"); + + MicrosoftRefreshResponse response = http.postFormGetJson( + MICROSOFT_TOKEN_ENDPOINT, + params, MicrosoftRefreshResponse.class + ); + + return loginWithTokens(new AuthTokens(response.getAccessToken(), response.getRefreshToken()),retrieveProfile); + } + /** * Logs in a player using a Microsoft account tokens retrieved earlier. * If the token was retrieved using Azure AAD/MSAL, it should be prefixed with d=