@@ -2,18 +2,15 @@ package auth
22
33import (
44 "context"
5- "crypto/rand"
65 "crypto/subtle"
76 "fmt"
87 "time"
98
109 "github.com/android-sms-gateway/server/internal/sms-gateway/models"
1110 "github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
1211 "github.com/android-sms-gateway/server/internal/sms-gateway/online"
12+ "github.com/android-sms-gateway/server/internal/sms-gateway/otp"
1313 "github.com/android-sms-gateway/server/pkg/crypto"
14- "github.com/capcom6/go-helpers/cache"
15- "github.com/jaevor/go-nanoid"
16- "go.uber.org/fx"
1714 "go.uber.org/zap"
1815)
1916
@@ -22,78 +19,50 @@ type Config struct {
2219 PrivateToken string
2320}
2421
25- type Params struct {
26- fx.In
27-
28- Config Config
29-
30- Users * repository
31- DevicesSvc * devices.Service
32- OnlineSvc online.Service
33-
34- Logger * zap.Logger
35- }
36-
3722type Service struct {
3823 config Config
3924
4025 users * repository
41- codesCache * cache.Cache [string ]
4226 usersCache * usersCache
4327
28+ otpSvc * otp.Service
4429 devicesSvc * devices.Service
4530 onlineSvc online.Service
4631
4732 logger * zap.Logger
48-
49- idgen func () string
5033}
5134
52- func New (params Params ) * Service {
53- const idLen = 21
54- idgen , _ := nanoid .Standard (idLen )
55-
35+ func New (
36+ config Config ,
37+ users * repository ,
38+ otpSvc * otp.Service ,
39+ devicesSvc * devices.Service ,
40+ onlineSvc online.Service ,
41+ logger * zap.Logger ,
42+ ) * Service {
5643 return & Service {
57- config : params .Config ,
58- users : params .Users ,
59- devicesSvc : params .DevicesSvc ,
60- onlineSvc : params .OnlineSvc ,
61- logger : params .Logger ,
62- idgen : idgen ,
63-
64- codesCache : cache.New [string ](cache.Config {TTL : codeTTL }),
65- usersCache : newUsersCache (),
66- }
67- }
44+ config : config ,
6845
69- // GenerateUserCode generates a unique one-time user authorization code.
70- func (s * Service ) GenerateUserCode (userID string ) (OneTimeCode , error ) {
71- var code string
72- var err error
73-
74- const bytesLen = 3
75- const maxCode = 1000000
76- b := make ([]byte , bytesLen )
77- validUntil := time .Now ().Add (codeTTL )
78- for range 3 {
79- if _ , err = rand .Read (b ); err != nil {
80- continue
81- }
82- num := (int (b [0 ]) << 16 ) | (int (b [1 ]) << 8 ) | int (b [2 ]) //nolint:mnd //bitshift
83- code = fmt .Sprintf ("%06d" , num % maxCode )
46+ users : users ,
8447
85- if err = s . codesCache . SetOrFail ( code , userID , cache . WithValidUntil ( validUntil )); err != nil {
86- continue
87- }
48+ otpSvc : otpSvc ,
49+ devicesSvc : devicesSvc ,
50+ onlineSvc : onlineSvc ,
8851
89- break
52+ logger : logger ,
53+
54+ usersCache : newUsersCache (),
9055 }
56+ }
9157
58+ // GenerateUserCode generates a unique one-time user authorization code.
59+ func (s * Service ) GenerateUserCode (ctx context.Context , userID string ) (* otp.Code , error ) {
60+ code , err := s .otpSvc .Generate (ctx , userID )
9261 if err != nil {
93- return OneTimeCode {} , fmt .Errorf ("failed to generate code: %w" , err )
62+ return nil , fmt .Errorf ("failed to generate code: %w" , err )
9463 }
9564
96- return OneTimeCode { Code : code , ValidUntil : validUntil } , nil
65+ return code , nil
9766}
9867
9968func (s * Service ) RegisterUser (login , password string ) (* models.User , error ) {
@@ -176,15 +145,15 @@ func (s *Service) AuthorizeUser(username, password string) (*models.User, error)
176145}
177146
178147// AuthorizeUserByCode authorizes a user by one-time code.
179- func (s * Service ) AuthorizeUserByCode (code string ) (* models.User , error ) {
180- userID , err := s .codesCache . GetAndDelete ( code )
148+ func (s * Service ) AuthorizeUserByCode (ctx context. Context , code string ) (* models.User , error ) {
149+ userID , err := s .otpSvc . Validate ( ctx , code )
181150 if err != nil {
182- return nil , fmt .Errorf ("failed to get user by code: %w" , err )
151+ return nil , fmt .Errorf ("failed to validate code: %w" , err )
183152 }
184153
185154 user , err := s .users .GetByID (userID )
186155 if err != nil {
187- return nil , err
156+ return nil , fmt . Errorf ( "failed to get user: %w" , err )
188157 }
189158
190159 return user , nil
@@ -234,6 +203,5 @@ func (s *Service) Run(ctx context.Context) {
234203}
235204
236205func (s * Service ) clean (_ context.Context ) {
237- s .codesCache .Cleanup ()
238206 s .usersCache .Cleanup ()
239207}
0 commit comments