58 lines
1.8 KiB
Go
58 lines
1.8 KiB
Go
package public
|
|
|
|
import (
|
|
"context"
|
|
customermodel "git.sendico.io/tech/sxchnge/product/customers/model"
|
|
sessionmodel "git.sendico.io/tech/sxchnge/product/sessions/model"
|
|
"net/http"
|
|
|
|
"git.sendico.io/tech/sxchnge/product/auth/http/v1/response"
|
|
rtokens "git.sendico.io/tech/sxchnge/product/sessions/tokens"
|
|
"git.sendico.io/tech/sxchnge/shared/http/response"
|
|
"git.sendico.io/tech/sxchnge/shared/logging/fields"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func (pr *PublicRouter) refreshAndRespondLogin(
|
|
ctx context.Context,
|
|
r *http.Request,
|
|
session *sessionmodel.SessionIdentifier,
|
|
account *customermodel.Account,
|
|
) http.HandlerFunc {
|
|
result, err := pr.prepareLogin(ctx, r, session, account)
|
|
if err != nil {
|
|
return response.Internal(pr.logger, pr.service, err)
|
|
}
|
|
return result
|
|
}
|
|
|
|
func (pr *PublicRouter) prepareLogin(ctx context.Context, r *http.Request, session *sessionmodel.SessionIdentifier, account *customermodel.Account) (http.HandlerFunc, error) {
|
|
refreshToken, err := rtokens.PrepareRefreshToken(
|
|
ctx,
|
|
r,
|
|
pr.rtdb,
|
|
pr.config.Length,
|
|
pr.config.Expiration.Refresh,
|
|
session,
|
|
account,
|
|
pr.logger,
|
|
)
|
|
if err != nil {
|
|
pr.logger.Warn("Failed to create refresh token", zap.Error(err), mzap.StorableRef(account),
|
|
zap.String("client_id", session.ClientID), zap.String("device_id", session.DeviceID))
|
|
return nil, err
|
|
}
|
|
accessToken, err := pr.imp.CreateAccessTokenForSession(account, refreshToken.SessionIdentifier)
|
|
if err != nil {
|
|
pr.logger.Warn("Failed to generate access token", zap.Error(err), mzap.StorableRef(account),
|
|
zap.String("client_id", session.ClientID), zap.String("device_id", session.DeviceID))
|
|
return nil, err
|
|
}
|
|
|
|
token := sresponse.TokenData{
|
|
Token: refreshToken.RefreshToken,
|
|
Expiration: refreshToken.ExpiresAt,
|
|
}
|
|
return sresponse.Login(pr.logger, account, &accessToken, &token), nil
|
|
}
|