본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
공부 시작 시각 인증
공부 시작 시각 인증
수강 인증 사진
수강 인증 사진
UserAuthRepository.java
package org.fastcampus.auth.application.Interfaces;
import org.fastcampus.auth.domain.UserAuth;
import org.fastcampus.user.domain.User;
public interface UserAuthRepository {
UserAuth registerUser(UserAuth auth, User user);
UserAuth loggingUser(String email, String password);
}
UserAuthRepositoryImpl.java
package org.fastcampus.auth.repository;
import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.fastcampus.auth.application.Interfaces.UserAuthRepository;
import org.fastcampus.auth.domain.UserAuth;
import org.fastcampus.auth.repository.entity.UserAuthEntity;
import org.fastcampus.auth.repository.jpa.JpaUserAuthRepository;
import org.fastcampus.user.application.Interfaces.UserRepository;
import org.fastcampus.user.domain.User;
import org.springframework.stereotype.Repository;
@Repository
@RequiredArgsConstructor
public class UserAuthRepositoryImpl implements UserAuthRepository {
private final JpaUserAuthRepository jpaUserAuthRepository;
private final UserRepository userRepository;
@Override
@Transactional
public UserAuth registerUser(UserAuth auth, User user) {
User savedUser = userRepository.save(user);
UserAuthEntity userAuthEntity = new UserAuthEntity(auth, savedUser.getId());
userAuthEntity = jpaUserAuthRepository.save(userAuthEntity);
return userAuthEntity.toUserAuth();
}
@Override
public UserAuth loggingUser(String email, String password) {
UserAuthEntity userAuthEntity = jpaUserAuthRepository.findById(email).orElseThrow();
UserAuth userAuth = userAuthEntity.toUserAuth();
if (!userAuth.matchPassword(password)) {
throw new IllegalArgumentException("Invalid password");
}
return userAuth;
}
}
UserAuth.java
package org.fastcampus.auth.domain;
public class UserAuth {
private final Email email;
private final Password password;
private final UserRole userRole;
private Long userId;
public UserAuth(String email, String password, String role) {
this.email = Email.createEmail(email);
this.password = Password.createPassword(password);
this.userRole = UserRole.valueOf(role);
}
public UserAuth(String email, String password, String role, Long userId) {
this.email = Email.createEmail(email);
this.password = Password.createEncryptPassword(password);
this.userRole = UserRole.valueOf(role);
this.userId = userId;
}
public String getEmail() {
return email.getEmailText();
}
public String getPassword() {
return password.getEncryptedPassword();
}
public String getUserRole() {
return userRole.name();
}
public Long getUserId() {
return userId;
}
public boolean matchPassword(String password) {
return this.password.matchPassword(password);
}
}
TokenProvider.java
package org.fastcampus.auth.domain;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import java.util.Date;
import javax.crypto.SecretKey;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class TokenProvider {
private final SecretKey key;
private static final long TOKEN_VALID_TIME = 1000L * 60 * 60;
public TokenProvider(@Value("${secret-key}") String secretKey) {
this.key = Keys.hmacShaKeyFor(secretKey.getBytes());
}
public String createToken(Long userId, String role) {
Claims claims = Jwts.claims()
.subject(userId.toString())
.build();
Date now = new Date();
Date validDate = new Date(now.getTime() + TOKEN_VALID_TIME);
return Jwts.builder()
.claims(claims)
.issuedAt(now)
.expiration(validDate)
.claim("role", role)
.signWith(key)
.compact();
}
public Long getUserId(String token) {
return Long.parseLong(
Jwts.parser()
.verifyWith(key)
.build()
.parseSignedClaims(token)
.getPayload()
.getSubject()
);
}
public String getUserRole(String token) {
return Jwts.parser()
.verifyWith(key)
.build()
.parseSignedClaims(token)
.getPayload()
.get("role", String.class);
}
}
AuthService.java
package org.fastcampus.auth.application;
import lombok.RequiredArgsConstructor;
import org.fastcampus.auth.application.Interfaces.EmailVerificationRepository;
import org.fastcampus.auth.application.Interfaces.UserAuthRepository;
import org.fastcampus.auth.application.dto.CreateUserAuthRequestDto;
import org.fastcampus.auth.application.dto.LoginRequestDto;
import org.fastcampus.auth.application.dto.UserAccessTokenResponseDto;
import org.fastcampus.auth.domain.Email;
import org.fastcampus.auth.domain.TokenProvider;
import org.fastcampus.auth.domain.UserAuth;
import org.fastcampus.user.domain.User;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class AuthService {
private final UserAuthRepository userAuthRepository;
private final EmailVerificationRepository verificationRepository;
private final TokenProvider tokenProvider;
public Long registerUser(CreateUserAuthRequestDto dto) {
Email email = Email.createEmail(dto.email());
if (!verificationRepository.isEmailVerified(email)) {
throw new IllegalStateException("Email is not verified");
}
UserAuth userAuth = new UserAuth(dto.email(), dto.password(), dto.role());
User user = new User(dto.name(), dto.profileUrl());
userAuth = userAuthRepository.registerUser(userAuth, user);
return userAuth.getUserId();
}
public UserAccessTokenResponseDto login(LoginRequestDto dto) {
UserAuth userAuth = userAuthRepository.loggingUser(dto.email(), dto.password());
String token = tokenProvider.createToken(userAuth.getUserId(), userAuth.getUserRole());
return new UserAccessTokenResponseDto(token);
}
}
LoginController.java
package org.fastcampus.auth.ui;
import lombok.RequiredArgsConstructor;
import org.fastcampus.auth.application.AuthService;
import org.fastcampus.auth.application.dto.LoginRequestDto;
import org.fastcampus.auth.application.dto.UserAccessTokenResponseDto;
import org.fastcampus.common.ui.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/login")
@RequiredArgsConstructor
public class LoginController {
private final AuthService authService;
@PostMapping
public Response<UserAccessTokenResponseDto> login(@RequestBody LoginRequestDto dto) {
return Response.OK(authService.login(dto));
}
}
학습 인증샷
학습 인증샷
공부 종료 시각 인증
공부 종료 시각 인증
https://bit.ly/4hTSJNB