Skip to content

Commit

Permalink
Create controller & handler for google sign in logic #43
Browse files Browse the repository at this point in the history
  • Loading branch information
CMenne committed Jun 25, 2018
1 parent 6a9d9f0 commit 997b65d
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 57 deletions.
64 changes: 7 additions & 57 deletions server/src/main/java/server/Server.java
Original file line number Diff line number Diff line change
@@ -1,44 +1,22 @@
package server;

import com.google.api.client.json.JsonFactory;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;
import server.database.users.UserRequestHandler;
import server.database.users.UserController;
import server.database.abstracts.AbstractController;
import server.database.abstracts.AbstractRequestHandler;
import server.database.login.LoginController;
import server.database.login.LoginRequestHandler;
import spark.Request;
import spark.Response;
import spark.Route;

import org.apache.commons.io.IOUtils;

import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;

import java.io.IOException;
import java.util.Collections;

import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.googleapis.auth.oauth2.*;

import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;

import static spark.Spark.*;
import static spark.debug.DebugScreen.enableDebugScreen;

import org.json.*;

import server.database.users.UserRequestHandler;
import server.database.users.UserController;
import server.database.abstracts.AbstractController;
import server.database.abstracts.AbstractRequestHandler;


public class Server {
private static final String databaseName = "dev";
private static final int serverPort = 4567;
Expand All @@ -54,6 +32,9 @@ public static void main(String[] args) throws IOException {
AbstractController abstractController = new AbstractController(database);
AbstractRequestHandler abstractRequestHandler = new AbstractRequestHandler(abstractController);

LoginController loginController = new LoginController();
LoginRequestHandler loginRequestHandler = new LoginRequestHandler(loginController);

//Configure Spark
port(serverPort);
enableDebugScreen();
Expand Down Expand Up @@ -89,7 +70,7 @@ public static void main(String[] args) throws IOException {
Route notFoundRoute = (req, res) -> {
res.type("text");
res.status(404);
return "Sorry, we couldn't find that!";
return "Sorry, we couldn't find that!!";
};

get("/", clientRoute);
Expand All @@ -108,39 +89,8 @@ public static void main(String[] args) throws IOException {
get("api/abstracts", abstractRequestHandler::getAbstracts);
get("api/abstracts/:id", abstractRequestHandler::getAbstractJSON);

post("api/login", (req, res) -> {
post("api/login", loginRequestHandler::loginUser);

JSONObject obj = new JSONObject(req.body());
String idTokenString = obj.getString("idToken");

String CLIENT_SECRET_FILE = "./src/main/java/server/database/server_files/client_secret.json";

NetHttpTransport transport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();

GoogleClientSecrets clientSecrets =
GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE));

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Collections.singletonList(clientSecrets.getDetails().getClientId()))
.build();





GoogleIdToken idToken = verifier.verify(idTokenString);

if (idToken != null) {
Payload payload = idToken.getPayload();

System.out.println(payload.getSubject());

}

return "";
});

get("api/error", (req, res) -> {
throw new RuntimeException("A demonstration error");
Expand Down
57 changes: 57 additions & 0 deletions server/src/main/java/server/database/login/LoginController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package server.database.login;

import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.mongodb.client.MongoDatabase;
import java.io.FileReader;
import java.util.Collections;

public class LoginController {

// Construct controller for login.
public LoginController() {

}


public String verifyIdToken(String idTokenString) {
String CLIENT_SECRET_FILE = "./src/main/java/server/database/server_files/client_secret.json";

NetHttpTransport transport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
String toReturn = "Failed to verify idToken";

try {
GoogleClientSecrets clientSecrets =
GoogleClientSecrets.load(
JacksonFactory.getDefaultInstance(), new FileReader(CLIENT_SECRET_FILE));

GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Collections.singletonList(clientSecrets.getDetails().getClientId()))
.build();

GoogleIdToken idToken = verifier.verify(idTokenString);

if (idToken != null) {
GoogleIdToken.Payload payload = idToken.getPayload();

if (payload.getHostedDomain().equals("morris.umn.edu")) {
toReturn = "Verified idToken";
}
} else {
System.out.println("Invalid ID token.");
}
} catch (Exception e) {
System.out.println(e);

toReturn = "null";
}


return toReturn;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package server.database.login;

import org.json.JSONObject;
import spark.Request;
import spark.Response;

/**
*
*/
public class LoginRequestHandler {

private final LoginController loginController;
public LoginRequestHandler(LoginController loginController){
this.loginController = loginController;
}

/**Method called from Server when the 'api/login' endpoint is received.
* Get a JSON response with a list of all the users in the database.
*
* @param req the HTTP request
* @param res the HTTP response
* @return one user in JSON formatted string and if it fails it will return text with a different HTTP status code
*/

public String loginUser(Request req, Response res) {
String idTokenString = getIdTokenString(req);
String verifyResponse = loginController.verifyIdToken(idTokenString);

if (!verifyResponse.equals("null")) {
return verifyResponse;
} else {
return "null";
}

}

/**Method called from Server when the 'api/login' endpoint is received.
* Get a JSON response with a list of all the users in the database.
*
* @param req the HTTP request
* @return one user in JSON formatted string and if it fails it will return text with a different HTTP status code
*/

private String getIdTokenString(Request req) {
return new JSONObject(req.body()).getString("idToken");
}
}

0 comments on commit 997b65d

Please sign in to comment.