done set authentication

This commit is contained in:
muhammadeko 2022-05-14 18:10:34 +07:00
parent 73799ec045
commit d1113517d8
No known key found for this signature in database
GPG Key ID: 51366716C10E98B1
6 changed files with 97 additions and 77 deletions

View File

@ -10,14 +10,14 @@ sourceCompatibility = 17
targetCompatibility = 17 targetCompatibility = 17
group 'me.exzork.gcauth' group 'me.exzork.gcauth'
version '2.1.6' version '2.2.0'
repositories { repositories {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
implementation files('lib/grasscutter-1.1.1-dev.jar') implementation files('lib/grasscutter-1.1.2-dev.jar')
implementation 'org.springframework.security:spring-security-crypto:5.6.3' implementation 'org.springframework.security:spring-security-crypto:5.6.3'
implementation 'commons-logging:commons-logging:1.2' implementation 'commons-logging:commons-logging:1.2'
implementation 'com.auth0:java-jwt:3.19.1' implementation 'com.auth0:java-jwt:3.19.1'

View File

@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder;
import emu.grasscutter.Grasscutter; import emu.grasscutter.Grasscutter;
import emu.grasscutter.plugin.Plugin; import emu.grasscutter.plugin.Plugin;
import me.exzork.gcauth.handler.*; import me.exzork.gcauth.handler.*;
import me.exzork.gcauth.router.GCAuthRouter;
import me.exzork.gcauth.utils.Authentication; import me.exzork.gcauth.utils.Authentication;
import java.io.File; import java.io.File;
@ -30,23 +31,19 @@ public class GCAuth extends Plugin {
} }
} }
loadConfig(); loadConfig();
if(Grasscutter.getDispatchServer().registerAuthHandler(new GCAuthAuthenticationHandler())) { Grasscutter.setAuthenticationSystem(new GCAuthAuthenticationHandler());
//Grasscutter.getHttpServer().addRouter(GCAuthRouter.class);
Grasscutter.getLogger().info("[GCAuth] GCAuth Enabled!"); Grasscutter.getLogger().info("[GCAuth] GCAuth Enabled!");
config.jwtSecret = Authentication.generateRandomString(32); config.jwtSecret = Authentication.generateRandomString(32);
saveConfig(); saveConfig();
if (Grasscutter.getConfig().account.autoCreate) { if (Grasscutter.getConfig().account.autoCreate) {
Grasscutter.getLogger().warn("[GCAuth] GCAuth does not support automatic account creation. Please disable in the server's config.json or just ignore this warning."); Grasscutter.getLogger().warn("[GCAuth] GCAuth does not support automatic account creation. Please disable in the server's config.json or just ignore this warning.");
} }
} else {
Grasscutter.getLogger().error("[GCAuth] GCAuth could not be enabled");
}
} }
@Override @Override
public void onDisable() { public void onDisable() {
if(Grasscutter.getDispatchServer().getAuthHandler().getClass().equals(GCAuthAuthenticationHandler.class)) {
Grasscutter.getDispatchServer().resetAuthHandler();
}
} }
public void loadConfig() { public void loadConfig() {
@ -66,6 +63,12 @@ public class GCAuth extends Plugin {
Grasscutter.getLogger().error("[GCAuth] Unable to save config file."); Grasscutter.getLogger().error("[GCAuth] Unable to save config file.");
} }
} }
public static Config getConfigStatic() {return config;}
public Config getConfig() {return config;} public static Config getConfigStatic() {
return config;
}
public Config getConfig() {
return config;
}
} }

View File

@ -1,75 +1,38 @@
package me.exzork.gcauth.handler; package me.exzork.gcauth.handler;
import emu.grasscutter.auth.AuthenticationSystem;
import emu.grasscutter.auth.Authenticator;
import emu.grasscutter.auth.DefaultAuthenticators;
import emu.grasscutter.server.http.objects.ComboTokenResJson;
import emu.grasscutter.server.http.objects.LoginResultJson;
import emu.grasscutter.Grasscutter; public class GCAuthAuthenticationHandler implements AuthenticationSystem {
import emu.grasscutter.game.Account; private final Authenticator<LoginResultJson> gcAuthAuthenticator = new GCAuthenticators.GCAuthAuthenticator();
import emu.grasscutter.server.dispatch.authentication.AuthenticationHandler; private final Authenticator<LoginResultJson> tokenAuthenticator = new DefaultAuthenticators.TokenAuthenticator();
import emu.grasscutter.server.dispatch.json.LoginAccountRequestJson; private final Authenticator<ComboTokenResJson> sessionKeyAuthenticator = new DefaultAuthenticators.SessionKeyAuthenticator();
import emu.grasscutter.server.dispatch.json.LoginResultJson;
import express.http.Request;
import express.http.Response;
import me.exzork.gcauth.utils.Authentication;
import java.io.IOException;
public class GCAuthAuthenticationHandler implements AuthenticationHandler {
@Override @Override
public void handleLogin(Request req, Response res) { public void createAccount(String username, String password) {
try {
new LoginHandler().handle(req, res);
} catch (IOException e) {
Grasscutter.getLogger().warn("[GCAuth] Unable to handle login request");
e.printStackTrace();
}
} }
@Override @Override
public void handleRegister(Request req, Response res) { public void resetPassword(String s) {
try {
new RegisterHandler().handle(req, res);
} catch (IOException e) {
Grasscutter.getLogger().warn("[GCAuth] Unable to handle register request");
e.printStackTrace();
}
} }
@Override @Override
public void handleChangePassword(Request req, Response res) { public Authenticator<LoginResultJson> getPasswordAuthenticator() {
try { return gcAuthAuthenticator;
new ChangePasswordHandler().handle(req, res);
} catch (IOException e) {
Grasscutter.getLogger().warn("[GCAuth] Unable to handle change password request");
e.printStackTrace();
}
} }
@Override @Override
public boolean verifyUser(String details) { public Authenticator<LoginResultJson> getTokenAuthenticator() {
return false; return tokenAuthenticator;
} }
@Override @Override
public LoginResultJson handleGameLogin(Request request, LoginAccountRequestJson requestData) { public Authenticator<ComboTokenResJson> getSessionKeyAuthenticator() {
LoginResultJson responseData = new LoginResultJson(); return sessionKeyAuthenticator;
// Login
Account account = Authentication.getAccountByOneTimeToken(requestData.account);
if(account == null) {
Grasscutter.getLogger().info("[GCAuth] Client " + request.ip() + " failed to log in");
responseData.retcode = -201;
responseData.message = "Token is invalid";
return responseData;
}
// Account was found, log the player in
responseData.message = "OK";
responseData.data.account.uid = account.getId();
responseData.data.account.token = account.generateSessionKey();
responseData.data.account.email = account.getEmail();
Grasscutter.getLogger().info(String.format("[GCAuth] Client %s logged in as %s", request.ip(), responseData.data.account.uid));
return responseData;
} }
} }

View File

@ -0,0 +1,39 @@
package me.exzork.gcauth.handler;
import emu.grasscutter.Grasscutter;
import emu.grasscutter.auth.AuthenticationSystem;
import emu.grasscutter.auth.Authenticator;
import emu.grasscutter.database.DatabaseHelper;
import emu.grasscutter.game.Account;
import emu.grasscutter.server.http.objects.LoginResultJson;
import me.exzork.gcauth.utils.Authentication;
public class GCAuthenticators {
public static class GCAuthAuthenticator implements Authenticator<LoginResultJson> {
@Override
public LoginResultJson authenticate(AuthenticationSystem.AuthenticationRequest authenticationRequest) {
var response = new LoginResultJson();
var requestData = authenticationRequest.getPasswordRequest();
assert requestData != null;
Account account = Authentication.getAccountByOneTimeToken(requestData.account);
if(account == null) {
Grasscutter.getLogger().info("[GCAuth] Client " + requestData.account + " tried to login with invalid one time token.");
response.retcode = -201;
response.message = "Token is invalid";
return response;
}
// Account was found, log the player in
response.message = "OK";
response.data.account.uid = account.getId();
response.data.account.token = account.generateSessionKey();
response.data.account.email = account.getEmail();
Grasscutter.getLogger().info("[GCAuth] Client " + requestData.account + " logged in");
return response;
}
}
}

View File

@ -17,8 +17,6 @@ public class LoginHandler implements HttpContextHandler {
@Override @Override
public void handle(Request request, Response response) throws IOException { public void handle(Request request, Response response) throws IOException {
AuthResponseJson authResponse = new AuthResponseJson(); AuthResponseJson authResponse = new AuthResponseJson();
try { try {
String requestBody = request.ctx().body(); String requestBody = request.ctx().body();
if (requestBody.isEmpty()) { if (requestBody.isEmpty()) {

View File

@ -0,0 +1,17 @@
package me.exzork.gcauth.router;
import emu.grasscutter.server.http.Router;
import express.Express;
import io.javalin.Javalin;
import me.exzork.gcauth.handler.ChangePasswordHandler;
import me.exzork.gcauth.handler.LoginHandler;
import me.exzork.gcauth.handler.RegisterHandler;
public class GCAuthRouter implements Router {
@Override
public void applyRoutes(Express express, Javalin javalin) {
express.post("/authentication/login", new LoginHandler());
express.post("/authentication/register", new RegisterHandler());
express.post("/authentication/change_password", new ChangePasswordHandler());
}
}