From d15c32df23ef2d8f12bc9c7723b68cf8ea30be30 Mon Sep 17 00:00:00 2001 From: YukariChiba Date: Tue, 17 May 2022 14:34:13 +0800 Subject: [PATCH] Add OAuth in AuthenticationSystem --- .../auth/AuthenticationSystem.java | 18 ++++++++++++ .../auth/DefaultAuthentication.java | 6 ++++ .../auth/DefaultAuthenticators.java | 25 +++++++++++++++++ .../grasscutter/auth/OAuthAuthenticator.java | 28 +++++++++++++++++++ .../server/http/dispatch/DispatchHandler.java | 8 ++++++ 5 files changed, 85 insertions(+) create mode 100644 src/main/java/emu/grasscutter/auth/OAuthAuthenticator.java diff --git a/src/main/java/emu/grasscutter/auth/AuthenticationSystem.java b/src/main/java/emu/grasscutter/auth/AuthenticationSystem.java index c9ae98d50..ee27dbca0 100644 --- a/src/main/java/emu/grasscutter/auth/AuthenticationSystem.java +++ b/src/main/java/emu/grasscutter/auth/AuthenticationSystem.java @@ -60,6 +60,12 @@ public interface AuthenticationSystem { */ ExternalAuthenticator getExternalAuthenticator(); + /** + * This is the authenticator used for handling OAuth authentication requests. + * @return An authenticator. + */ + OAuthAuthenticator getOAuthAuthenticator(); + /** * A data container that holds relevant data for authenticating a client. */ @@ -125,4 +131,16 @@ public interface AuthenticationSystem { return AuthenticationRequest.builder().request(request) .response(response).build(); } + + + /** + * Generates an authentication request from a {@link Response} object. + * @param request The Express request. + * @param jsonData The JSON data. + * @return An authentication request. + */ + static AuthenticationRequest fromOAuthRequest(Request request, Response response) { + return AuthenticationRequest.builder().request(request) + .response(response).build(); + } } diff --git a/src/main/java/emu/grasscutter/auth/DefaultAuthentication.java b/src/main/java/emu/grasscutter/auth/DefaultAuthentication.java index b47985cf6..ba77e7d6e 100644 --- a/src/main/java/emu/grasscutter/auth/DefaultAuthentication.java +++ b/src/main/java/emu/grasscutter/auth/DefaultAuthentication.java @@ -17,6 +17,7 @@ public final class DefaultAuthentication implements AuthenticationSystem { private final Authenticator tokenAuthenticator = new TokenAuthenticator(); private final Authenticator sessionKeyAuthenticator = new SessionKeyAuthenticator(); private final ExternalAuthenticator externalAuthenticator = new ExternalAuthentication(); + private final OAuthAuthenticator oAuthAuthenticator = new OAuthAuthentication(); @Override public void createAccount(String username, String password) { @@ -53,4 +54,9 @@ public final class DefaultAuthentication implements AuthenticationSystem { public ExternalAuthenticator getExternalAuthenticator() { return this.externalAuthenticator; } + + @Override + public OAuthAuthenticator getOAuthAuthenticator() { + return this.oAuthAuthenticator; + } } diff --git a/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java b/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java index 57d0541f2..0a9916a59 100644 --- a/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java +++ b/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java @@ -174,4 +174,29 @@ public final class DefaultAuthenticators { request.getResponse().send("Authentication is not available with the default authentication method."); } } + + /** + * Handles authentication requests from OAuth sources. + */ + public static class OAuthAuthentication implements OAuthAuthenticator { + @Override public void handleLogin(AuthenticationRequest request) { + assert request.getResponse() != null; + request.getResponse().send("Authentication is not available with the default authentication method."); + } + + @Override public void handleDesktopRedirection(AuthenticationRequest request) { + assert request.getResponse() != null; + request.getResponse().send("Authentication is not available with the default authentication method."); + } + + @Override public void handleMobileRedirection(AuthenticationRequest request) { + assert request.getResponse() != null; + request.getResponse().send("Authentication is not available with the default authentication method."); + } + + @Override public void handleTokenProcess(AuthenticationRequest request) { + assert request.getResponse() != null; + request.getResponse().send("Authentication is not available with the default authentication method."); + } + } } diff --git a/src/main/java/emu/grasscutter/auth/OAuthAuthenticator.java b/src/main/java/emu/grasscutter/auth/OAuthAuthenticator.java new file mode 100644 index 000000000..394d14371 --- /dev/null +++ b/src/main/java/emu/grasscutter/auth/OAuthAuthenticator.java @@ -0,0 +1,28 @@ +package emu.grasscutter.auth; + +import emu.grasscutter.auth.AuthenticationSystem.AuthenticationRequest; + +/** + * Handles authentication via OAuth routes. + */ +public interface OAuthAuthenticator { + + /** + * Called when an OAuth login request is made. + * @param request The authentication request. + */ + void handleLogin(AuthenticationRequest request); + + /** + * Called when an client requests to redirect to login page. + * @param request The authentication request. + */ + void handleDesktopRedirection(AuthenticationRequest request); + void handleMobileRedirection(AuthenticationRequest request); + + /** + * Called when an OAuth login requests callback. + * @param request The authentication request. + */ + void handleTokenProcess(AuthenticationRequest request); +} diff --git a/src/main/java/emu/grasscutter/server/http/dispatch/DispatchHandler.java b/src/main/java/emu/grasscutter/server/http/dispatch/DispatchHandler.java index 5f9edcf0a..96e1fda84 100644 --- a/src/main/java/emu/grasscutter/server/http/dispatch/DispatchHandler.java +++ b/src/main/java/emu/grasscutter/server/http/dispatch/DispatchHandler.java @@ -33,6 +33,14 @@ public final class DispatchHandler implements Router { .handleAccountCreation(AuthenticationSystem.fromExternalRequest(request, response))); express.post("/authentication/change_password", (request, response) -> Grasscutter.getAuthenticationSystem().getExternalAuthenticator() .handlePasswordReset(AuthenticationSystem.fromExternalRequest(request, response))); + + // OAuth login + express.post("/hk4e_global/mdk/shield/api/loginByThirdparty", (request, response) -> Grasscutter.getAuthenticationSystem().getOAuthAuthenticator().handleLogin(AuthenticationSystem.fromOAuthRequest(request, response))); + // OAuth querystring convert redirection + express.get("/authentication/openid/redirect", (request, response) -> Grasscutter.getAuthenticationSystem().getOAuthAuthenticator().handleTokenProcess(AuthenticationSystem.fromOAuthRequest(request, response))); + // OAuth redirection + express.get("/Api/twitter_login", (request, response) -> Grasscutter.getAuthenticationSystem().getOAuthAuthenticator().handleDesktopRedirection(AuthenticationSystem.fromOAuthRequest(request, response))); + express.get("/sdkTwitterLogin.html", (request, response) -> Grasscutter.getAuthenticationSystem().getOAuthAuthenticator().handleMobileRedirection(AuthenticationSystem.fromOAuthRequest(request, response))); } /**