Files
identity-service/src/internal/service/auth.go
Piotr Biernat 662a9b7ffd Added access checking middleware
Added URLAccessRepository
Refactor
2025-10-22 10:53:20 +02:00

111 lines
2.7 KiB
Go

package service
import (
"context"
"errors"
"fmt"
entity "git.ego.freeddns.org/egommerce/api-entities/identity/entity"
domain "git.ego.freeddns.org/egommerce/identity-service/domain/repository"
"github.com/go-redis/redis/v8"
)
var (
passSrv *PaswordService
ErrLoginIncorrect = errors.New("login incorrect")
ErrUnableToCacheToken = errors.New("unable to save tokens in cache")
ErrInvalidAccessToken = errors.New("invalid access token")
)
func init() {
passSrv = NewPasswordService()
}
type Auth struct {
userRepo *domain.UserRepository
cache *redis.Client
}
func NewAuthService(userRepo *domain.UserRepository, cache *redis.Client) *Auth {
return &Auth{
userRepo: userRepo,
cache: cache,
}
}
func (a *Auth) Login(login, passwd string) (string, error) {
user, err := a.userRepo.FindByUsername(login)
if err != nil {
// if err = database.NoRowsInQuerySet(err); err != nil {
// return "", errors.New("no user found")
// }
return "", ErrLoginIncorrect
}
if err = passSrv.Verify(passwd, user.Password); err != nil {
return "", ErrLoginIncorrect
}
accessToken, _ := jwtSrv.CreateAccessToken(user.ID)
refreshToken, _ := jwtSrv.CreateRefreshToken(user.ID)
if err = a.saveTokensToCache(user.ID, accessToken, refreshToken); err != nil {
return "", ErrUnableToCacheToken
}
return accessToken, nil
}
func (a *Auth) RefreshToken(accessToken string) (string, error) {
token, claims, err := jwtSrv.ValidateAccessToken(accessToken)
if err != nil || !token.Valid {
return "", ErrInvalidAccessToken
}
id := claims["sub"]
newAccessToken, _ := jwtSrv.CreateAccessToken(id.(string))
newRefreshToken, _ := jwtSrv.CreateRefreshToken(id.(string))
if err = a.saveTokensToCache(id.(string), newAccessToken, newRefreshToken); err != nil {
return "", ErrUnableToCacheToken
}
return newAccessToken, nil
}
func (a *Auth) VerifyToken(token string) (string, error) {
return token, nil
}
func (a *Auth) Register(email, login, passwd string) (string, error) {
passwd, _ = passSrv.Hash(passwd)
id, err := a.userRepo.Create(&entity.User{
Email: email,
Username: login,
Password: passwd,
})
if err != nil {
return "", err
}
return id, nil
}
func (a *Auth) saveTokensToCache(id, accessToken, refreshToken string) error {
res := a.cache.Set(context.Background(), "auth:access_token:"+id, accessToken, accessTokenExpireTime)
if err := res.Err(); err != nil {
fmt.Println("failed to save access token in cache: ", err.Error())
}
res = a.cache.Set(context.Background(), "auth:refresh_token:"+id, refreshToken, refreshTokenExpireTime)
if err := res.Err(); err != nil {
fmt.Println("failed to save refresh token in cache: ", err.Error())
}
return nil
}