Skip to content

Commit

Permalink
Merge pull request #20 from naeemark/develop
Browse files Browse the repository at this point in the history
Develop to Master
  • Loading branch information
naeemark committed Aug 21, 2020
2 parents 2d0910f + 3a6d477 commit 5ece994
Show file tree
Hide file tree
Showing 25 changed files with 636 additions and 79 deletions.
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.naeemark.jas.api.health;

import com.naeemark.jas.models.response.HealthResponse;
import com.naeemark.jas.utils.Constants;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
Expand Down
12 changes: 3 additions & 9 deletions src/main/java/com/naeemark/jas/api/login/LoginController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.naeemark.jas.api.login;

import com.naeemark.jas.models.AuthResponse;
import com.naeemark.jas.models.LoginRequest;
import com.naeemark.jas.models.response.AuthResponse;
import com.naeemark.jas.models.request.LoginRequest;
import com.naeemark.jas.models.User;
import com.naeemark.jas.services.AuthService;
import io.swagger.annotations.Api;
Expand Down Expand Up @@ -48,13 +48,7 @@ public class LoginController {
* @return Auth Response
*/
@ApiOperation(value = "Login", response = AuthResponse.class, tags = {"2 - Login"})
@ApiResponses(value = {
@ApiResponse(code = 304, message = "Operation was not successful"),
@ApiResponse(code = 400, message = "Validation Error"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 417, message = "Expectations failed"),
@ApiResponse(code = 422, message = "Request not processable")
})
@ApiResponses(value = {@ApiResponse(code = 403, message = "Forbidden")})
@PostMapping(value = "/login")
public AuthResponse login(@Valid @RequestBody LoginRequest loginRequest) {
logger.info(loginRequest.toString());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.naeemark.jas.api.signup;

import com.naeemark.jas.models.AuthResponse;
import com.naeemark.jas.models.SignupRequest;
import com.naeemark.jas.models.response.AuthResponse;
import com.naeemark.jas.models.request.SignupRequest;
import com.naeemark.jas.models.User;
import com.naeemark.jas.services.AuthService;
import io.swagger.annotations.Api;
Expand Down
43 changes: 43 additions & 0 deletions src/main/java/com/naeemark/jas/api/user/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.naeemark.jas.api.user;

import com.naeemark.jas.models.response.UserResponse;
import com.naeemark.jas.utils.JwtTokenUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* Created by Naeem <naeemark@gmail.com>.
* <p>
* Created on: 2020-08-21
*/
@Api(tags = "3 - User", description = "Gets User Data by the header Token")
@RestController
@RequestMapping("/api")
public class UserController {

private static final Logger logger = LoggerFactory.getLogger(UserController.class);

@ApiOperation(value = "Get User", notes = "Gets User Object", response = UserResponse.class)
@ApiResponses(value = {
@ApiResponse(code = 304, message = "Operation was not successful"),
@ApiResponse(code = 400, message = "Validation Error"),
@ApiResponse(code = 404, message = "Not Found"),
@ApiResponse(code = 417, message = "Expectations failed"),
@ApiResponse(code = 422, message = "Request not processable")
})
@GetMapping(value = "/user")
public UserResponse getUser(@RequestHeader("Authorization") String authorization) {

UserResponse userResponse = JwtTokenUtils.validateAuthorization(authorization);
logger.info(userResponse.toString());
return userResponse;
}
}
12 changes: 0 additions & 12 deletions src/main/java/com/naeemark/jas/exceptions/AuthException.java

This file was deleted.

5 changes: 3 additions & 2 deletions src/main/java/com/naeemark/jas/models/User.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.naeemark.jas.models;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.naeemark.jas.models.request.SignupRequest;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Expand Down Expand Up @@ -33,10 +34,10 @@ public class User {
@Column(unique = true, name = "user_name")
private String userName;

@Column(unique = true)
@Column(unique = true, name = "email")
private String email;

@Column
@Column(name = "password")
private String password;


Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.naeemark.jas.models;
package com.naeemark.jas.models.request;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
Expand All @@ -13,6 +14,7 @@
* Created on: 2020-08-20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class LoginRequest {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.naeemark.jas.models;
package com.naeemark.jas.models.request;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
Expand All @@ -14,6 +15,7 @@
* Created on: 2020-08-20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class SignupRequest {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.naeemark.jas.models;
package com.naeemark.jas.models.response;

import com.naeemark.jas.models.User;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.naeemark.jas.api.health;
package com.naeemark.jas.models.response;

import lombok.AllArgsConstructor;
import lombok.Data;
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/com/naeemark/jas/models/response/UserResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.naeemark.jas.models.response;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
* Created by Naeem <naeemark@gmail.com>.
* <p>
* Created on: 2020-08-20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UserResponse {

private Integer id;
private String name;
private String userName;
private String email;
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,5 @@
@Component
public interface UserRepository extends JpaRepository<User, Integer> {

User findByEmail(String email);
User findByUserNameOrEmail(String userName, String email);

boolean existsByEmail(String email);
}
6 changes: 3 additions & 3 deletions src/main/java/com/naeemark/jas/services/AuthService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.naeemark.jas.services;

import com.naeemark.jas.models.AuthResponse;
import com.naeemark.jas.models.LoginRequest;
import com.naeemark.jas.models.SignupRequest;
import com.naeemark.jas.models.response.AuthResponse;
import com.naeemark.jas.models.request.LoginRequest;
import com.naeemark.jas.models.request.SignupRequest;
import com.naeemark.jas.models.User;

/**
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/com/naeemark/jas/services/AuthServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.naeemark.jas.services;

import com.naeemark.jas.models.AuthResponse;
import com.naeemark.jas.models.LoginRequest;
import com.naeemark.jas.models.SignupRequest;
import com.naeemark.jas.models.response.AuthResponse;
import com.naeemark.jas.models.request.LoginRequest;
import com.naeemark.jas.models.request.SignupRequest;
import com.naeemark.jas.models.User;
import com.naeemark.jas.repositories.UserRepository;
import com.naeemark.jas.utils.JwtUtils;
import com.naeemark.jas.utils.JwtTokenUtils;
import com.naeemark.jas.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -95,7 +95,7 @@ public User login(LoginRequest loginRequest) {
*/
@Override
public AuthResponse getAuthResponse(User user) {
String accessToken = JwtUtils.generateJwtToken(user);
String accessToken = JwtTokenUtils.generateToken(user);
AuthResponse authResponse = new AuthResponse(accessToken, new User(user.getId(), user.getName()));
logger.info(authResponse.toString());
return authResponse;
Expand Down
14 changes: 9 additions & 5 deletions src/main/java/com/naeemark/jas/utils/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,14 @@
* Created on: 2020-08-20
*/
public class Constants {
public static String SERVICE_NAME = "jwt-auth-service";
public static final String SERVICE_NAME = "jwt-auth-service";
public static final String JWT_SECRET_KEY = "this-is-a-secret-key";
public static final long JWT_ACCESS_TOKEN_EXPIRY_MILLIS = 1000L * 60 * 60; // ONE HOUR

public static String ERROR_DUPLICATE_KEY_ATTRIBUTE = "Duplication of such attribute is not allowed";
public static String ERROR_USER_NOT_FOUND = "Requested user is not found in the system";
public static String ERROR_WRONG_PASSWORD = "The provided password does not match";
public static String ERROR_AUTH_SERVICE = "Something wrong happend in AuthService";
public static final String ERROR_DUPLICATE_KEY_ATTRIBUTE = "Duplication of such attribute is not allowed";
public static final String ERROR_USER_NOT_FOUND = "Requested user is not found in the system";
public static final String ERROR_WRONG_PASSWORD = "The provided password does not match";
public static final String ERROR_AUTH_SERVICE = "Something wrong happend in AuthService";
public static final String ERROR_AUTHORIZATION_REQUIRED = "Should you provide authorization";
public static final String ERROR_INVALID_AUTHORIZATION = "Expired or Invalid authorization Token was provided";
}
71 changes: 71 additions & 0 deletions src/main/java/com/naeemark/jas/utils/JwtTokenUtils.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.naeemark.jas.utils;

import com.naeemark.jas.models.User;
import com.naeemark.jas.models.response.UserResponse;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;

import java.util.Date;

import static com.naeemark.jas.utils.Constants.*;

/**
* Created by Naeem <naeemark@gmail.com>.
* <p>
* Created on: 2020-08-21
*/
public class JwtTokenUtils {

private static final Logger logger = LoggerFactory.getLogger(JwtTokenUtils.class);

/**
* Generates an Access Token based on provided payload
*
* @param user User
* @return String
*/
public static String generateToken(User user) {

long timestamp = System.currentTimeMillis();
String token = Jwts.builder().signWith(SignatureAlgorithm.HS256, JWT_SECRET_KEY)
.setIssuedAt(new Date(timestamp))
.setExpiration(new Date(timestamp + JWT_ACCESS_TOKEN_EXPIRY_MILLIS))
.claim("id", user.getId())
.claim("name", user.getName())
.claim("email", user.getEmail())
.claim("userName", user.getUserName())
.compact();

logger.info(token);
return token;
}

/**
* Validates and returns claim values
*
* @param authorization
* @return
*/
public static UserResponse validateAuthorization(String authorization) {
if (authorization == null || authorization.isEmpty()) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, ERROR_AUTHORIZATION_REQUIRED);
}
try {
Claims claims = Jwts.parser().setSigningKey(JWT_SECRET_KEY)
.parseClaimsJws(authorization).getBody();
return new UserResponse(
Integer.parseInt(claims.get("id").toString()),
claims.get("name").toString(),
claims.get("userName").toString(),
claims.get("email").toString()
);
} catch (Exception e) {
throw new ResponseStatusException(HttpStatus.FORBIDDEN, ERROR_INVALID_AUTHORIZATION);
}
}
}
15 changes: 0 additions & 15 deletions src/main/java/com/naeemark/jas/utils/JwtUtils.java

This file was deleted.

14 changes: 0 additions & 14 deletions src/main/java/com/naeemark/jas/utils/StringUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.regex.Pattern;

/**
* Created by Naeem <naeemark@gmail.com>.
Expand All @@ -12,19 +11,6 @@
*/
public class StringUtils {

public static boolean isValidEmail(String email)
{
String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\."+
"[a-zA-Z0-9_+&*-]+)*@" +
"(?:[a-zA-Z0-9-]+\\.)+[a-z" +
"A-Z]{2,7}$";

Pattern pat = Pattern.compile(emailRegex);
if (email == null)
return false;
return pat.matcher(email).matches();
}

/**
* Returns a Hashed Password
* @param passwordToHash String
Expand Down
Loading

0 comments on commit 5ece994

Please sign in to comment.