From 4dac152cbfa1f97fa41a08366a99ff5b4beead2c Mon Sep 17 00:00:00 2001 From: Daniel <nieltansah@gmail.com> Date: Thu, 16 Nov 2017 18:14:17 +0700 Subject: [PATCH] TugasBesar2: IdentityService: Migrate project --- TugasBesar2_2017/IdentityService/build.gradle | 23 +++ .../identityservice/models/UserModel.java | 189 ++++++++++++++++++ .../services/TokenService.java | 23 +++ .../servlets/LoginServlet.java | 47 +++++ .../servlets/LogoutServlet.java | 30 +++ .../servlets/RegisterServlet.java | 46 +++++ .../servlets/TokenVerifier.java | 30 +++ .../resources/config/db.properties.example | 4 + .../src/main/webapp/WEB-INF/sun-jaxws.xml | 10 + .../src/main/webapp/WEB-INF/web.xml | 49 +++++ 10 files changed, 451 insertions(+) create mode 100644 TugasBesar2_2017/IdentityService/build.gradle create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java create mode 100644 TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example create mode 100644 TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml create mode 100644 TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml diff --git a/TugasBesar2_2017/IdentityService/build.gradle b/TugasBesar2_2017/IdentityService/build.gradle new file mode 100644 index 0000000..0660364 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java' + id 'war' + id 'org.akhikhl.gretty' +} + +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + + compile project(':SharedLibrary') + + // https://mvnrepository.com/artifact/junit/junit + testCompile 'junit:junit:4.12' + // https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api + providedCompile 'javax.servlet:javax.servlet-api:4.0.0' + // https://mvnrepository.com/artifact/com.google.code.gson/gson + compile 'com.google.code.gson:gson:2.8.2' + + // https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-ri + gretty 'com.sun.xml.ws:jaxws-ri:2.3.0' + // https://mvnrepository.com/artifact/mysql/mysql-connector-java + gretty 'mysql:mysql-connector-java:8.0.8-dmr' +} diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java new file mode 100644 index 0000000..30cf9b8 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/models/UserModel.java @@ -0,0 +1,189 @@ +package com.adaapa.identityservice.models; + +import com.adaapa.bean.UserBean; +import com.adaapa.models.BaseModel; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; + +public class UserModel extends BaseModel { + Connection conn; + public UserModel(){ + super("users","id"); + } + + public UserBean parseResultSet(ResultSet rs) throws SQLException { + UserBean res = new UserBean(); + res.id = rs.getInt("id"); + res.name = rs.getString("name"); + res.email = rs.getString("email"); + res.username = rs.getString("username"); + res.phoneNumber = rs.getString("phone_number"); + return res; + } + + public UserBean findUser(Integer id) { + UserBean res = null; + + try { + ResultSet rs = find(id); + if (rs.next()) { + res = parseResultSet(rs); + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + public UserBean findUser(String username) { + UserBean res = null; + try { + ResultSet rs = query(String.format("SELECT * FROM %s WHERE username = '%s'", tableName, username ));; + if (rs.next()) { + res = parseResultSet(rs); + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + public UserBean findUserByEmail(String email) { + UserBean res = null; + try { + ResultSet rs = query(String.format("SELECT * FROM %s WHERE email = '%s'", tableName, email)); + ; + if (rs.next()) { + res = parseResultSet(rs); + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + + /** + * + * @param username Username yang diterima oleh servlet + * @param password Password yang diterima oleh servlet + * @return UserBean object jika terautentikasi, null jika tidak + */ + public UserBean authenticate(String username, String password) { + UserBean ubean = null; + try { + ResultSet rs = query(String.format( + "SELECT * FROM %s WHERE username = '%s' and password = '%s'", + tableName, username, password)); + if(rs.next()) { + ubean = parseResultSet(rs); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + return ubean; + + } + } + + /** + * Menyimpan token yang telah digenerate + * @param token token yang sudah digenerate oleh generate token + * @return true jika token berhasil disimpan, false jika tidak berhasil + */ + public Boolean saveToken(Integer userId, String token) { + try { + ResultSet rs = queryUpdate(String.format( + "UPDATE %s SET last_token='%s',token_expire=DATE_ADD(now(), INTERVAL 7 DAY) where id=%d", this.tableName, token, userId + )); + } catch (SQLException e) { + e.printStackTrace(); + } + return true; + } + + public Boolean deleteToken(String token) { + try { + ResultSet rs = queryUpdate(String.format( + "UPDATE %s SET last_token=%s,token_expire=%s WHERE last_token='%s'",this.tableName,null,null,token + )); + } catch (SQLException e) { + e.printStackTrace(); + return false; + } + return true; + } + + + /** + * + * @return Userbean dimana token ditemukan, null validasi gagal + */ + public UserBean validateToken() { + return null; + + } + + /** + * Fungsi untuk menyimpan data user yang akan diregister ke database + * @param user bean dari servlet + * @param password password yang diterima oleh servlet + * @return id yang didapatkan oleh user yang teregister, null jika register gagal + */ + public Integer register(UserBean user, String password) { + UserBean ubean = null; + Integer res = null; + UserBean ubeanuname = findUser(user.getUsername()); + UserBean ubeanemail = findUserByEmail(user.getEmail()); + if(ubeanuname == null && ubeanemail == null) { + ResultSet resultSet = null; + try { + resultSet = queryUpdate(String.format( + "INSERT INTO %s (name,email,username,password,phone_number)" + + "VALUES ('%s','%s','%s','%s','%s')", + tableName,user.name,user.email,user.username, password, user.phoneNumber + )); + } catch (Exception e) { + e.printStackTrace(); + } + + try { + ResultSet temp = query(String.format( + "SELECT * FROM %s WHERE username = '%s'", this.tableName, user.getUsername())); + if(temp.next()) { + ubean = parseResultSet(temp); + } + } catch (Exception e) { + e.printStackTrace(); + } + res = ubean.getId(); + } + + return res; + } + + public UserBean findUserByToken(String token) { + UserBean res = null; + try { + ResultSet rs = query(String.format("SELECT * FROM %s WHERE last_token = '%s'", tableName, token ));; + if (rs.next()) { + Timestamp timestamp = rs.getTimestamp("token_expire"); + Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); + if(timestamp.after(currentTimestamp)) { + res = parseResultSet(rs); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return res; + } + public void updateTokenLifetime(Integer userId) { + try { + ResultSet rs = queryUpdate(String.format( + "UPDATE %s SET token_expire=DATE_ADD(now(), INTERVAL 7 DAY) where id=%d", this.tableName, userId + )); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java new file mode 100644 index 0000000..bfcede3 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/services/TokenService.java @@ -0,0 +1,23 @@ +package com.adaapa.identityservice.services; + +import java.util.Base64; +import java.util.Random; + +public class TokenService { + + //TODO: generate Token + + /** + * Generate token menghasilkan token string random + * @return token yang telah digenerate + */ + //TODO:Generate Token, validate token, regenerate token(bonus) + public String generateToken(){ + byte [] r = new byte[96]; + Random rand = new Random(); + rand.nextBytes(r); + String s = Base64.getEncoder().encodeToString(r); + return s; + } + +} diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java new file mode 100644 index 0000000..2f96df8 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LoginServlet.java @@ -0,0 +1,47 @@ +package com.adaapa.identityservice.servlets; + +import com.adaapa.bean.LoginResponseBean; +import com.adaapa.bean.UserBean; +import com.adaapa.identityservice.models.UserModel; +import com.adaapa.identityservice.services.TokenService; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by kennethhalim on 10/26/17. + */ + +public class LoginServlet extends HttpServlet { + private String message; + + + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + TokenService tokenService = new TokenService(); + String username = req.getParameter("username"); + String password = req.getParameter("password"); + PrintWriter out = resp.getWriter(); + Gson gson = new Gson(); + UserModel userModel = new UserModel(); + UserBean user= userModel.authenticate(username, password); + UserBean responseUser = new UserBean(); + if(user != null) { + //Call Generate token here, then save it to database via usermodel; + responseUser.username = user.username; + String access_token = tokenService.generateToken(); + userModel.saveToken(user.id, access_token); + out.println(gson.toJson(new LoginResponseBean("accepted",access_token, LoginResponseBean.TOKEN_AGE_DEFAULT, responseUser))); + } else { + out.println(gson.toJson(new LoginResponseBean("failed","",0,null))); + } + } + + public void destroy() { + // do nothing. + } +} diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java new file mode 100644 index 0000000..fbc633d --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/LogoutServlet.java @@ -0,0 +1,30 @@ +package com.adaapa.identityservice.servlets; + +import com.adaapa.bean.LogoutResponseBean; +import com.adaapa.identityservice.models.UserModel; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class LogoutServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + String token = req.getParameter("access_token"); + UserModel userModel = new UserModel(); + PrintWriter out = resp.getWriter(); + LogoutResponseBean logoutResponse = new LogoutResponseBean(); + if(userModel.deleteToken(token)){ + logoutResponse.setStatus("accepted"); + } else { + logoutResponse.setStatus("failed"); + } + Gson gson = new Gson(); + out.println(gson.toJson(logoutResponse)); + } +} diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java new file mode 100644 index 0000000..39fe54b --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/RegisterServlet.java @@ -0,0 +1,46 @@ +package com.adaapa.identityservice.servlets; + +import com.adaapa.bean.LoginResponseBean; +import com.adaapa.bean.UserBean; +import com.adaapa.identityservice.models.UserModel; +import com.adaapa.identityservice.services.TokenService; +import com.google.gson.Gson; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class RegisterServlet extends HttpServlet{ + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + //Implement Register Here + UserBean user = new UserBean(); + UserModel userModel = new UserModel(); + UserModel usermodel = new UserModel(); + TokenService tokenService = new TokenService(); + //Parsing data + PrintWriter out = resp.getWriter(); + user.name = req.getParameter("name"); + user.username = req.getParameter("username"); + user.email = req.getParameter("email"); + user.phoneNumber = req.getParameter("phoneNumber"); + String password = req.getParameter("password"); + Gson gson = new Gson(); + user.id = userModel.register(user,password); + UserBean responseUser = new UserBean(); + if(user.id != null) { + //Register berhasil + //Generate token here, then save token + String token = tokenService.generateToken(); + userModel.saveToken(user.id, token); + responseUser.username = user.username; + out.println(gson.toJson(new LoginResponseBean("accepted",token, LoginResponseBean.TOKEN_AGE_DEFAULT, responseUser))); + } else { + out.println(gson.toJson(new LoginResponseBean("failed","",0,null))); + } + } +} \ No newline at end of file diff --git a/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java new file mode 100644 index 0000000..b8227fd --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/java/com/adaapa/identityservice/servlets/TokenVerifier.java @@ -0,0 +1,30 @@ +package com.adaapa.identityservice.servlets; + +import com.adaapa.bean.TokenVerificationResponse; +import com.adaapa.bean.UserBean; +import com.adaapa.identityservice.models.UserModel; +import com.google.gson.Gson; +import javax.jws.WebMethod; +import javax.jws.WebParam; +import javax.jws.WebResult; +import javax.jws.WebService; + +@WebService(targetNamespace = "tokenverifier.adaapa.com") +public class TokenVerifier { + @WebMethod(operationName = "verifyToken") + @WebResult(name = "userObjectInJSON") + public String verifyToken(@WebParam(name = "access_token") String access_token) { + UserModel userModel = new UserModel(); + UserBean userBean = userModel.findUserByToken(access_token); + TokenVerificationResponse response = new TokenVerificationResponse(); + if(userBean != null){ + userModel.updateTokenLifetime(userBean.getId()); + response.setStatus(TokenVerificationResponse.TOKEN_VALID); + response.setUser(userBean); + } else { + response.setStatus(TokenVerificationResponse.TOKEN_INVALID); + } + return (new Gson().toJson(response)); + } + +} diff --git a/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example b/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example new file mode 100644 index 0000000..2ac73ae --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/resources/config/db.properties.example @@ -0,0 +1,4 @@ +DB_HOST = localhost +DB_USER = wbd +DB_PASS = wbd123 +DB_NAME = wbd_idservice \ No newline at end of file diff --git a/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml new file mode 100644 index 0000000..8241076 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/sun-jaxws.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<endpoints + xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" + version="2.0"> + + <endpoint + name="TokenVerifier" + implementation="com.adaapa.identityservice.servlets.TokenVerifier" + url-pattern="/verify"/> +</endpoints> diff --git a/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..d502625 --- /dev/null +++ b/TugasBesar2_2017/IdentityService/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<web-app + xmlns="http://java.sun.com/xml/ns/j2ee" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + version="4.0"> + + <listener> + <listener-class> + com.sun.xml.ws.transport.http.servlet.WSServletContextListener + </listener-class> + </listener> + + <servlet> + <servlet-name>LoginServlet</servlet-name> + <servlet-class>com.adaapa.identityservice.servlets.LoginServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>LoginServlet</servlet-name> + <url-pattern>/login</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>LogoutServlet</servlet-name> + <servlet-class>com.adaapa.identityservice.servlets.LogoutServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>LogoutServlet</servlet-name> + <url-pattern>/logout</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>RegisterServlet</servlet-name> + <servlet-class>com.adaapa.identityservice.servlets.RegisterServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>RegisterServlet</servlet-name> + <url-pattern>/register</url-pattern> + </servlet-mapping> + + <servlet> + <servlet-name>web-jaxws</servlet-name> + <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> + </servlet> + <servlet-mapping> + <servlet-name>web-jaxws</servlet-name> + <url-pattern>/soap</url-pattern> + </servlet-mapping> +</web-app> -- GitLab