11package kattsyn .dev .rentplace .services .impl ;
22
3- import io .jsonwebtoken .Claims ;
43import io .micrometer .common .lang .NonNull ;
54import jakarta .security .auth .message .AuthException ;
5+ import jakarta .servlet .http .HttpServletRequest ;
66import kattsyn .dev .rentplace .dtos .requests .JwtRequest ;
77import kattsyn .dev .rentplace .dtos .responses .CodeResponse ;
88import kattsyn .dev .rentplace .dtos .responses .JwtResponse ;
1414import kattsyn .dev .rentplace .enums .UserStatus ;
1515import kattsyn .dev .rentplace .exceptions .ForbiddenException ;
1616import kattsyn .dev .rentplace .services .AuthService ;
17+ import kattsyn .dev .rentplace .services .RefreshTokenService ;
1718import kattsyn .dev .rentplace .services .UserService ;
1819import kattsyn .dev .rentplace .auth .JwtProvider ;
1920import kattsyn .dev .rentplace .services .VerificationCodeService ;
2324import org .springframework .security .core .context .SecurityContextHolder ;
2425import org .springframework .stereotype .Service ;
2526
26- import java .util .HashMap ;
27- import java .util .Map ;
2827import java .util .Optional ;
2928
3029@ Service
3130@ RequiredArgsConstructor
3231@ Slf4j
3332public class AuthServiceImpl implements AuthService {
3433
35- //todo: сделать хранение Refresh Токенов в БД, вместе с ip, либо именами устройств.
36- //TODO: также при превышении кол-ва макс устройств разлогинить везде пользователя
37-
3834 private final UserService userService ;
39- private final Map <String , String > refreshStorage = new HashMap <>();
4035 private final JwtProvider jwtProvider ;
4136 private final VerificationCodeService verificationCodeService ;
37+ private final RefreshTokenService refreshTokenService ;
4238
4339 @ Override
44- public JwtResponse register (@ NonNull RegisterRequest registerRequest ) throws AuthException {
40+ public JwtResponse register (@ NonNull RegisterRequest registerRequest , HttpServletRequest httpServletRequest ) throws AuthException {
4541 User user = userService .createUserWithRegisterRequest (registerRequest );
4642
47- return getJwtResponse (user , registerRequest .getEmail (), registerRequest .getCode ());
43+ return getJwtResponse (user , registerRequest .getEmail (), registerRequest .getCode (), httpServletRequest );
4844 }
4945
5046 @ Override
@@ -65,28 +61,28 @@ public CodeResponse getCodeResponse(String email) {
6561 }
6662
6763 @ Override
68- public JwtResponse login (@ NonNull JwtRequest authRequest ) throws AuthException {
64+ public JwtResponse login (@ NonNull JwtRequest authRequest , HttpServletRequest httpServletRequest ) throws AuthException {
6965 final User user = userService .getUserByEmail (authRequest .getEmail ());
7066
71- return getJwtResponse (user , authRequest .getEmail (), authRequest .getCode ());
67+ return getJwtResponse (user , authRequest .getEmail (), authRequest .getCode (), httpServletRequest );
7268 }
7369
7470 @ Override
75- public JwtResponse adminLogin (@ NonNull JwtRequest authRequest ) throws AuthException {
71+ public JwtResponse adminLogin (@ NonNull JwtRequest authRequest , HttpServletRequest httpServletRequest ) throws AuthException {
7672 final User user = userService .getUserByEmail (authRequest .getEmail ());
7773
7874 if (user .getRole () != Role .ROLE_ADMIN ) {
7975 throw new ForbiddenException ("You are not allowed to access admin-panel." );
8076 }
8177
82- return getJwtResponse (user , authRequest .getEmail (), authRequest .getCode ());
78+ return getJwtResponse (user , authRequest .getEmail (), authRequest .getCode (), httpServletRequest );
8379 }
8480
85- private JwtResponse getJwtResponse (User user , String email , String code ) throws AuthException {
81+ private JwtResponse getJwtResponse (User user , String email , String code , HttpServletRequest httpServletRequest ) throws AuthException {
8682 if ((email .equals ("testadmin@gmail.com" ) && code .equals ("12345" )) || verificationCodeService .validateCode (email , code )) { //todo: delete test user
8783 final String accessToken = jwtProvider .generateAccessToken (user );
8884 final String refreshToken = jwtProvider .generateRefreshToken (user );
89- refreshStorage .put (user . getEmail (), refreshToken );
85+ refreshTokenService .put (refreshToken , user , httpServletRequest );
9086 return new JwtResponse (accessToken , refreshToken );
9187 } else {
9288 throw new AuthException ("Код неправильный" );
@@ -98,34 +94,16 @@ public void validateCode(JwtRequest request) {
9894 verificationCodeService .validateCode (request .getEmail (), request .getCode ());
9995 }
10096
101- public JwtResponse getAccessToken (@ NonNull String refreshToken ) {
102- if (jwtProvider .validateRefreshToken (refreshToken )) {
103- final Claims claims = jwtProvider .getRefreshClaims (refreshToken );
104- final String email = claims .getSubject ();
105- final String saveRefreshToken = refreshStorage .get (email );
106- if (saveRefreshToken != null && saveRefreshToken .equals (refreshToken )) {
107- final User user = userService .getUserByEmail (email );
108- final String accessToken = jwtProvider .generateAccessToken (user );
109- return new JwtResponse (accessToken , null );
110- }
97+ public JwtResponse getAccessToken (@ NonNull String refreshToken , HttpServletRequest httpServletRequest ) {
98+ try {
99+ return refreshTokenService .refreshAccessToken (refreshToken , httpServletRequest );
100+ } catch (AuthException e ) {
101+ return new JwtResponse (null , null );
111102 }
112- return new JwtResponse (null , null );
113103 }
114104
115- public JwtResponse refresh (@ NonNull String refreshToken ) throws AuthException {
116- if (jwtProvider .validateRefreshToken (refreshToken )) {
117- final Claims claims = jwtProvider .getRefreshClaims (refreshToken );
118- final String email = claims .getSubject ();
119- final String saveRefreshToken = refreshStorage .get (email );
120- if (saveRefreshToken != null && saveRefreshToken .equals (refreshToken )) {
121- final User user = userService .getUserByEmail (email );
122- final String accessToken = jwtProvider .generateAccessToken (user );
123- final String newRefreshToken = jwtProvider .generateRefreshToken (user );
124- refreshStorage .put (user .getEmail (), newRefreshToken );
125- return new JwtResponse (accessToken , newRefreshToken );
126- }
127- }
128- throw new AuthException ("Невалидный JWT токен" );
105+ public JwtResponse refresh (@ NonNull String refreshToken , HttpServletRequest request ) throws AuthException {
106+ return refreshTokenService .refresh (refreshToken , request );
129107 }
130108
131109 public UserDTO getUserInfo () throws AuthException {
@@ -137,6 +115,4 @@ public UserDTO getUserInfo() throws AuthException {
137115 String email = authentication .getName ();
138116 return userService .getUserDTOByEmail (email );
139117 }
140-
141-
142118}
0 commit comments