diff --git a/build.gradle b/build.gradle index 6526530..b02e9fa 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-security' // MySQL runtimeOnly 'com.mysql:mysql-connector-j' @@ -30,6 +31,14 @@ dependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + // OAuth + implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' + + // jwt + implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' + implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' + implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5' + // test testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' diff --git a/src/main/java/com/GDGoC/BaS/config/JwtTokenProvider.java b/src/main/java/com/GDGoC/BaS/config/JwtTokenProvider.java new file mode 100644 index 0000000..04a883d --- /dev/null +++ b/src/main/java/com/GDGoC/BaS/config/JwtTokenProvider.java @@ -0,0 +1,31 @@ +package com.GDGoC.BaS.config; + +import com.GDGoC.BaS.user.User; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import java.util.Date; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class JwtTokenProvider { + + @Value("${jwt.secret}") + private String jwtSecret; + + @Value("${jwt.expiration}") + private long expiration; + + public String generateToken(User user) { + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + expiration); + + return Jwts.builder() + .setSubject(Long.toString(user.getUserId())) + .claim("email", user.getEmail()) + .setIssuedAt(now) + .setExpiration(expiryDate) + .signWith(SignatureAlgorithm.HS512, jwtSecret) + .compact(); + } +} diff --git a/src/main/java/com/GDGoC/BaS/user/User.java b/src/main/java/com/GDGoC/BaS/user/User.java index 8d192b7..aef1068 100644 --- a/src/main/java/com/GDGoC/BaS/user/User.java +++ b/src/main/java/com/GDGoC/BaS/user/User.java @@ -9,13 +9,14 @@ import com.GDGoC.BaS.clothing.UserAccessory; import com.GDGoC.BaS.clothing.UserHead; import com.GDGoC.BaS.clothing.UserTowel; -import com.GDGoC.BaS.waterdrop.WaterdropHistory; import com.GDGoC.BaS.notification.Notification; import com.GDGoC.BaS.shower.UserRecord; import com.GDGoC.BaS.user.enums.Eye; import com.GDGoC.BaS.user.enums.Mouth; import com.GDGoC.BaS.user.enums.Nose; +import com.GDGoC.BaS.user.enums.Provider; import com.GDGoC.BaS.user.enums.Skin; +import com.GDGoC.BaS.waterdrop.WaterdropHistory; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Enumerated; @@ -26,9 +27,11 @@ import jakarta.validation.constraints.Min; import java.util.ArrayList; import java.util.List; +import lombok.Getter; import lombok.NoArgsConstructor; @Entity +@Getter @NoArgsConstructor(access = PROTECTED) public class User { @@ -67,6 +70,13 @@ public class User { @Column(nullable = false, length = 20) private Mouth mouth; + @Enumerated(STRING) + @Column(nullable = false) + private Provider provider; + + @Column(nullable = false) + private String providerId; + @OneToMany(mappedBy = "user", cascade = ALL, orphanRemoval = true) private List waterdropHistories = new ArrayList<>(); diff --git a/src/main/java/com/GDGoC/BaS/user/enums/Provider.java b/src/main/java/com/GDGoC/BaS/user/enums/Provider.java new file mode 100644 index 0000000..ced5e03 --- /dev/null +++ b/src/main/java/com/GDGoC/BaS/user/enums/Provider.java @@ -0,0 +1,5 @@ +package com.GDGoC.BaS.user.enums; + +public enum Provider { + GOOGLE +}