mirror of
https://github.com/Miasmusa/Shadow.git
synced 2024-11-25 00:38:08 -05:00
fix mojang auth
This commit is contained in:
parent
5c58e9f0cc
commit
630eae7862
5 changed files with 206 additions and 33 deletions
|
@ -54,7 +54,7 @@ public class AlteningAuth {
|
||||||
yggdrasilUserAuthentication.logIn();
|
yggdrasilUserAuthentication.logIn();
|
||||||
((IMinecraftClientAccessor) ShadowMain.client).setSession(new Session(yggdrasilUserAuthentication.getSelectedProfile().getName(), yggdrasilUserAuthentication.getSelectedProfile().getId().toString(), yggdrasilUserAuthentication.getAuthenticatedToken(), Optional.empty(), Optional.empty(), Session.AccountType.MOJANG));
|
((IMinecraftClientAccessor) ShadowMain.client).setSession(new Session(yggdrasilUserAuthentication.getSelectedProfile().getName(), yggdrasilUserAuthentication.getSelectedProfile().getId().toString(), yggdrasilUserAuthentication.getAuthenticatedToken(), Optional.empty(), Optional.empty(), Session.AccountType.MOJANG));
|
||||||
this.username = yggdrasilUserAuthentication.getSelectedProfile().getName();
|
this.username = yggdrasilUserAuthentication.getSelectedProfile().getName();
|
||||||
return new MinecraftToken(yggdrasilUserAuthentication.getAuthenticatedToken(),username);
|
return new MinecraftToken(yggdrasilUserAuthentication.getAuthenticatedToken(),username,yggdrasilUserAuthentication.getSelectedProfile().getId());
|
||||||
}
|
}
|
||||||
catch (AuthenticationException authenticationException) {
|
catch (AuthenticationException authenticationException) {
|
||||||
return null;
|
return null;
|
||||||
|
|
143
src/main/java/me/x150/authlib/login/mojang/AuthResponse.java
Normal file
143
src/main/java/me/x150/authlib/login/mojang/AuthResponse.java
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
package me.x150.authlib.login.mojang;
|
||||||
|
|
||||||
|
import com.google.gson.annotations.Expose;
|
||||||
|
import com.google.gson.annotations.SerializedName;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class AuthResponse {
|
||||||
|
public class User {
|
||||||
|
|
||||||
|
@SerializedName("id")
|
||||||
|
@Expose
|
||||||
|
private String id;
|
||||||
|
@SerializedName("username")
|
||||||
|
@Expose
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
public class SelectedProfile {
|
||||||
|
|
||||||
|
@SerializedName("name")
|
||||||
|
@Expose
|
||||||
|
private String name;
|
||||||
|
@SerializedName("id")
|
||||||
|
@Expose
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@SerializedName("user")
|
||||||
|
@Expose
|
||||||
|
private User user;
|
||||||
|
@SerializedName("clientToken")
|
||||||
|
@Expose
|
||||||
|
private String clientToken;
|
||||||
|
@SerializedName("accessToken")
|
||||||
|
@Expose
|
||||||
|
private String accessToken;
|
||||||
|
@SerializedName("selectedProfile")
|
||||||
|
@Expose
|
||||||
|
private SelectedProfile selectedProfile;
|
||||||
|
@SerializedName("availableProfiles")
|
||||||
|
@Expose
|
||||||
|
private List<AvailableProfile> availableProfiles = null;
|
||||||
|
|
||||||
|
public User getUser() {
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUser(User user) {
|
||||||
|
this.user = user;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getClientToken() {
|
||||||
|
return clientToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClientToken(String clientToken) {
|
||||||
|
this.clientToken = clientToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccessToken() {
|
||||||
|
return accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccessToken(String accessToken) {
|
||||||
|
this.accessToken = accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SelectedProfile getSelectedProfile() {
|
||||||
|
return selectedProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedProfile(SelectedProfile selectedProfile) {
|
||||||
|
this.selectedProfile = selectedProfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<AvailableProfile> getAvailableProfiles() {
|
||||||
|
return availableProfiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvailableProfiles(List<AvailableProfile> availableProfiles) {
|
||||||
|
this.availableProfiles = availableProfiles;
|
||||||
|
}
|
||||||
|
public class AvailableProfile {
|
||||||
|
|
||||||
|
@SerializedName("name")
|
||||||
|
@Expose
|
||||||
|
private String name;
|
||||||
|
@SerializedName("id")
|
||||||
|
@Expose
|
||||||
|
private String id;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,29 +1,24 @@
|
||||||
package me.x150.authlib.login.mojang;
|
package me.x150.authlib.login.mojang;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonSyntaxException;
|
||||||
import com.google.gson.reflect.TypeToken;
|
import com.google.gson.reflect.TypeToken;
|
||||||
import java.io.BufferedReader;
|
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLConnection;
|
import java.net.URLConnection;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import me.x150.authlib.exception.AuthFailureException;
|
import me.x150.authlib.exception.AuthFailureException;
|
||||||
import me.x150.authlib.login.altening.AlteningAuth;
|
import me.x150.authlib.login.altening.AlteningAuth;
|
||||||
import me.x150.authlib.login.microsoft.MicrosoftAuthenticator;
|
import me.x150.authlib.login.microsoft.MicrosoftAuthenticator;
|
||||||
import me.x150.authlib.login.microsoft.XboxToken;
|
import me.x150.authlib.login.microsoft.XboxToken;
|
||||||
import me.x150.authlib.login.mojang.MinecraftToken;
|
|
||||||
import me.x150.authlib.login.mojang.profile.MinecraftProfile;
|
import me.x150.authlib.login.mojang.profile.MinecraftProfile;
|
||||||
import me.x150.authlib.login.mojang.profile.MinecraftProfileCape;
|
|
||||||
import me.x150.authlib.login.mojang.profile.MinecraftProfileSkin;
|
|
||||||
import me.x150.authlib.struct.Authenticator;
|
import me.x150.authlib.struct.Authenticator;
|
||||||
|
|
||||||
public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
||||||
protected final MicrosoftAuthenticator microsoftAuthenticator = new MicrosoftAuthenticator();
|
protected final MicrosoftAuthenticator microsoftAuthenticator = new MicrosoftAuthenticator();
|
||||||
|
|
||||||
|
@ -44,13 +39,14 @@ public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
||||||
request.add("agent", agent);
|
request.add("agent", agent);
|
||||||
request.addProperty("username", email);
|
request.addProperty("username", email);
|
||||||
request.addProperty("password", password);
|
request.addProperty("password", password);
|
||||||
request.addProperty("clientToken","");
|
request.addProperty("requestUser", false);
|
||||||
request.addProperty("requestUser", true);
|
|
||||||
String requestBody = request.toString();
|
String requestBody = request.toString();
|
||||||
|
|
||||||
httpURLConnection.setFixedLengthStreamingMode(requestBody.length());
|
httpURLConnection.setFixedLengthStreamingMode(requestBody.length());
|
||||||
httpURLConnection.setRequestProperty("Content-Type", "application/json");
|
httpURLConnection.setRequestProperty("Content-Type", "application/json");
|
||||||
httpURLConnection.setRequestProperty("Host", "authserver.mojang.com");
|
// httpURLConnection.setRequestProperty("Host", "authserver.mojang.com");
|
||||||
httpURLConnection.connect();
|
httpURLConnection.connect();
|
||||||
|
|
||||||
OutputStream outputStream = httpURLConnection.getOutputStream();
|
OutputStream outputStream = httpURLConnection.getOutputStream();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -70,9 +66,9 @@ public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
||||||
if (outputStream != null) {
|
if (outputStream != null) {
|
||||||
outputStream.close();
|
outputStream.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject jsonObject = this.parseResponseData(httpURLConnection);
|
JsonObject jsonObject = this.parseResponseData(httpURLConnection);
|
||||||
return new MinecraftToken(jsonObject.get("accessToken").getAsString(), ((JsonObject)jsonObject.get("selectedProfile")).get("name").getAsString());
|
|
||||||
|
return new MinecraftToken(jsonObject.get("accessToken").getAsString(), jsonObject.get("selectedProfile").getAsJsonObject().get("name").getAsString(),generateUUID(jsonObject.get("selectedProfile").getAsJsonObject().get("id").getAsString()));
|
||||||
} catch (IOException var14) {
|
} catch (IOException var14) {
|
||||||
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var14.getMessage()));
|
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var14.getMessage()));
|
||||||
}
|
}
|
||||||
|
@ -115,7 +111,7 @@ public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
||||||
}
|
}
|
||||||
|
|
||||||
JsonObject jsonObject = this.microsoftAuthenticator.parseResponseData(httpURLConnection);
|
JsonObject jsonObject = this.microsoftAuthenticator.parseResponseData(httpURLConnection);
|
||||||
return new MinecraftToken(jsonObject.get("access_token").getAsString(), jsonObject.get("username").getAsString());
|
return new MinecraftToken(jsonObject.get("access_token").getAsString(), jsonObject.get("username").getAsString(),UUID.fromString(jsonObject.get("selected_profile").getAsJsonObject().get("id").getAsString()));
|
||||||
} catch (IOException var14) {
|
} catch (IOException var14) {
|
||||||
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var14.getMessage()));
|
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var14.getMessage()));
|
||||||
}
|
}
|
||||||
|
@ -127,38 +123,58 @@ public class MinecraftAuthenticator extends Authenticator<MinecraftToken> {
|
||||||
|
|
||||||
public MinecraftProfile getGameProfile(MinecraftToken minecraftToken) {
|
public MinecraftProfile getGameProfile(MinecraftToken minecraftToken) {
|
||||||
try {
|
try {
|
||||||
|
if(isForceMigrated(minecraftToken)) {
|
||||||
|
// this request is completly useless....
|
||||||
|
return new MinecraftProfile(minecraftToken.getUuid(),minecraftToken.getUsername());
|
||||||
|
}
|
||||||
URL url = new URL("https://api.minecraftservices.com/minecraft/profile");
|
URL url = new URL("https://api.minecraftservices.com/minecraft/profile");
|
||||||
URLConnection urlConnection = url.openConnection();
|
URLConnection urlConnection = url.openConnection();
|
||||||
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
|
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
|
||||||
httpURLConnection.setRequestMethod("GET");
|
httpURLConnection.setRequestMethod("GET");
|
||||||
httpURLConnection.setRequestProperty("Authorization", "Bearer " + minecraftToken.getAccessToken());
|
httpURLConnection.setRequestProperty("Authorization", "Bearer "+minecraftToken.getAccessToken());
|
||||||
httpURLConnection.setRequestProperty("Host", "api.minecraftservices.com");
|
|
||||||
httpURLConnection.connect();
|
httpURLConnection.connect();
|
||||||
JsonObject jsonObject = this.parseResponseData(httpURLConnection);
|
JsonObject jsonObject = this.parseResponseData(httpURLConnection);
|
||||||
|
|
||||||
UUID uuid = this.generateUUID(jsonObject.get("id").getAsString());
|
UUID uuid = this.generateUUID(jsonObject.get("id").getAsString());
|
||||||
String name = jsonObject.get("name").getAsString();
|
String name = jsonObject.get("name").getAsString();
|
||||||
|
|
||||||
|
|
||||||
return new MinecraftProfile(uuid, name);
|
return new MinecraftProfile(uuid, name);
|
||||||
} catch (IOException var10) {
|
} catch (IOException var10) {
|
||||||
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var10.getMessage()));
|
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var10.getMessage()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public boolean isForceMigrated(MinecraftToken minecraftToken) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
URL url = new URL("https://api.minecraftservices.com/rollout/v1/msamigrationforced");
|
||||||
|
URLConnection urlConnection = url.openConnection();
|
||||||
|
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
|
||||||
|
httpURLConnection.setRequestMethod("GET");
|
||||||
|
httpURLConnection.setRequestProperty("Authorization", "Bearer "+minecraftToken.getAccessToken());
|
||||||
|
httpURLConnection.connect();
|
||||||
|
JsonObject jsonObject = this.parseResponseData(httpURLConnection);
|
||||||
|
boolean rollout = jsonObject.get("rollout").getAsBoolean();
|
||||||
|
|
||||||
|
|
||||||
|
return rollout;
|
||||||
|
} catch (IOException var10) {
|
||||||
|
throw new AuthFailureException(String.format("Authentication error. Request could not be made! Cause: '%s'", var10.getMessage()));
|
||||||
|
}
|
||||||
|
}
|
||||||
public JsonObject parseResponseData(HttpURLConnection httpURLConnection) throws IOException {
|
public JsonObject parseResponseData(HttpURLConnection httpURLConnection) throws IOException {
|
||||||
BufferedReader bufferedReader;
|
|
||||||
if (httpURLConnection.getResponseCode() != 200) {
|
|
||||||
bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getErrorStream()));
|
|
||||||
} else {
|
|
||||||
bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
|
|
||||||
}
|
|
||||||
|
|
||||||
String lines = (String)bufferedReader.lines().collect(Collectors.joining());
|
InputStream stream = httpURLConnection.getInputStream();
|
||||||
JsonObject jsonObject = (JsonObject)this.gson.fromJson(lines, JsonObject.class);
|
|
||||||
if (jsonObject.has("error")) {
|
StringBuilder textBuilder = new StringBuilder();
|
||||||
throw new AuthFailureException(String.format("Could not find profile!. Error: '%s'", jsonObject.get("errorMessage").getAsString()));
|
try (Reader reader = new BufferedReader(new InputStreamReader
|
||||||
} else {
|
(stream, Charset.forName(StandardCharsets.UTF_8.name())))) {
|
||||||
return jsonObject;
|
int c = 0;
|
||||||
|
while ((c = reader.read()) != -1) {
|
||||||
|
textBuilder.append((char) c);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
return this.gson.fromJson(textBuilder.toString(),JsonObject.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID generateUUID(String trimmedUUID) throws IllegalArgumentException {
|
public UUID generateUUID(String trimmedUUID) throws IllegalArgumentException {
|
||||||
|
|
|
@ -1,15 +1,28 @@
|
||||||
package me.x150.authlib.login.mojang;
|
package me.x150.authlib.login.mojang;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class MinecraftToken {
|
public class MinecraftToken {
|
||||||
private String accessToken;
|
private String accessToken;
|
||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
|
private UUID uuid;
|
||||||
|
|
||||||
|
|
||||||
public MinecraftToken() {
|
public MinecraftToken() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public MinecraftToken(String accessToken, String username) {
|
public MinecraftToken(String accessToken, String username, UUID uuid) {
|
||||||
this.accessToken = accessToken;
|
this.accessToken = accessToken;
|
||||||
this.username = username;
|
this.username = username;
|
||||||
|
|
||||||
|
this.uuid = uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public UUID getUuid() {
|
||||||
|
return uuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAccessToken() {
|
public String getAccessToken() {
|
||||||
|
@ -20,6 +33,7 @@ public class MinecraftToken {
|
||||||
return this.username;
|
return this.username;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "MinecraftToken{accessToken='" + this.accessToken + '\'' + ", username='" + this.username + '\'' + '}';
|
return "MinecraftToken{accessToken='" + this.accessToken + '\'' + ", username='" + this.username + '\'' + '}';
|
||||||
}
|
}
|
||||||
|
|
|
@ -819,6 +819,7 @@ public class AltManagerScreen extends ClientScreen implements FastTickable {
|
||||||
}
|
}
|
||||||
|
|
||||||
void downloadTexture() {
|
void downloadTexture() {
|
||||||
|
if(this.storage.cachedUuid == null) return;
|
||||||
this.tex = PlayerHeadResolver.resolve(this.storage.cachedUuid);
|
this.tex = PlayerHeadResolver.resolve(this.storage.cachedUuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -850,7 +851,6 @@ public class AltManagerScreen extends ClientScreen implements FastTickable {
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
}
|
}
|
||||||
storage.accessToken = token.getAccessToken();
|
storage.accessToken = token.getAccessToken();
|
||||||
|
|
||||||
MinecraftProfile profile = auth.getGameProfile(token);
|
MinecraftProfile profile = auth.getGameProfile(token);
|
||||||
storage.cachedName = profile.getUsername();
|
storage.cachedName = profile.getUsername();
|
||||||
storage.cachedUuid = profile.getUuid();
|
storage.cachedUuid = profile.getUuid();
|
||||||
|
|
Loading…
Reference in a new issue