From d99a31916320dba7c1185fdd9dfc1b5754d72e6d Mon Sep 17 00:00:00 2001 From: tiptok <785409885@qq.com> Date: Tue, 2 Nov 2021 10:34:15 +0800 Subject: [PATCH] 扫码登录修改 --- pkg/application/auth/service/service.go | 55 ++++++++++++++++++++----------------------------------- pkg/domain/qrcode.go | 44 +++++++++----------------------------------- pkg/infrastructure/cache/login_qrcode.go | 6 +----- 3 files changed, 30 insertions(+), 75 deletions(-) diff --git a/pkg/application/auth/service/service.go b/pkg/application/auth/service/service.go index ee8e59a..a8a0276 100644 --- a/pkg/application/auth/service/service.go +++ b/pkg/application/auth/service/service.go @@ -107,45 +107,36 @@ func (svr AuthService) AuthLoginSms(loginCommand *command.LoginSmsCommand) (inte //AuthLoginQrcode 扫码登录 func (svr AuthService) AuthLoginQrcode(queryParam *query.QrcodeLoginStatusQuery) (interface{}, error) { - qrmsg := domain.QrcodeMessage{} failLoginData := map[string]interface{}{ "isLogin": false, "access": struct{}{}, } - err := qrmsg.ParseToken(queryParam.Key) + cache := cache.LoginQrcodeCache{} + qrcodeMessage, err := cache.Get(queryParam.Key) if err != nil { log.Logger.Error(err.Error()) return nil, application.ThrowError(application.TRANSACTION_ERROR, "二维码已失效") } - qrCache := cache.LoginQrcodeCache{} - qrmsgCache, err := qrCache.Get(qrmsg.Id) - if err != nil { - log.Logger.Error(err.Error()) - return nil, application.ThrowError(application.TRANSACTION_ERROR, "二维码已失效") - } - if !qrmsgCache.IsLogin { + if !qrcodeMessage.IsLogin { return failLoginData, nil } + loginToken := domain.LoginToken{ - UserId: qrmsgCache.UserId, - UserBaseId: qrmsgCache.UserBaseId, - Account: qrmsgCache.Account, + UserId: qrcodeMessage.UserId, + UserBaseId: qrcodeMessage.UserBaseId, + Account: qrcodeMessage.Account, Platform: domain.LoginPlatformWeb, - CompanyId: qrmsgCache.CompanyId, - OrgId: qrmsgCache.OrgId, - } - // accessToken, err := loginToken.GenerateAccessToken() - // if err != nil { - // return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) - // } - qrCache.Remove(qrmsgCache.Id) - // _ = accessToken + CompanyId: qrcodeMessage.CompanyId, + OrgId: qrcodeMessage.OrgId, + } + cache.Remove(queryParam.Key) result, err := svr.getToken(loginToken) if err != nil { return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) } + data := map[string]interface{}{ - "isLogin": qrmsgCache.IsLogin, + "isLogin": qrcodeMessage.IsLogin, "access": result["token"], } return data, nil @@ -153,20 +144,15 @@ func (svr AuthService) AuthLoginQrcode(queryParam *query.QrcodeLoginStatusQuery) //AuthLoginQrcodeBind 扫码登录-绑定 func (svr AuthService) AuthLoginQrcodeBinding(bindingCmd *command.QrcodeBindingCommand) (interface{}, error) { - qrmsg := domain.QrcodeMessage{} - err := qrmsg.ParseToken(bindingCmd.Key) - if err != nil { - return nil, application.ThrowError(application.TRANSACTION_ERROR, "您扫描的二维码无效,请确认后重新扫描") - } qrCache := cache.LoginQrcodeCache{} - qrmsgCache, err := qrCache.Get(qrmsg.Id) + qrcodeMessage, err := qrCache.Get(bindingCmd.Key) if err != nil { return nil, application.ThrowError(application.TRANSACTION_ERROR, "您扫描的二维码无效,请确认后重新扫描") } - if err := qrmsgCache.BindUser(bindingCmd.Operator); err != nil { + if err := qrcodeMessage.BindUser(bindingCmd.Operator); err != nil { return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) } - if err := qrCache.Save(*qrmsgCache); err != nil { + if err := qrCache.Save(*qrcodeMessage); err != nil { log.Logger.Error(err.Error()) return nil, application.ThrowError(application.TRANSACTION_ERROR, "登录失败,请重试") } @@ -721,19 +707,18 @@ func (svr AuthService) GetCompanyOrgsByUser(queryParam *query.GetCompanyOrgsByUs //GetQrcode 获取扫码登录需要的二维码 func (svr AuthService) GetQrcode() (interface{}, error) { - qrmsg := domain.QrcodeMessage{} - _, err := qrmsg.GenerateImageBase64() //imgBase64 + qrcodeMessage := domain.QrcodeMessage{} + _, err := qrcodeMessage.Init() //imgBase64 if err != nil { return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) } qrCache := cache.LoginQrcodeCache{} - err = qrCache.Save(qrmsg) + err = qrCache.Save(qrcodeMessage) if err != nil { return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) } data := map[string]interface{}{ - //"image": imgBase64, - "key": qrmsg.Token, + "key": qrcodeMessage.Token, } return data, nil } diff --git a/pkg/domain/qrcode.go b/pkg/domain/qrcode.go index 5f06868..15f1aed 100644 --- a/pkg/domain/qrcode.go +++ b/pkg/domain/qrcode.go @@ -4,22 +4,22 @@ import ( "encoding/base64" "fmt" "github.com/forgoer/openssl" + "github.com/google/uuid" "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/constant" - "time" - - jwt "github.com/dgrijalva/jwt-go" + "gitlab.fjmaimaimai.com/allied-creation/allied-creation-gateway/pkg/log" + "strings" ) const ( qrcodeTokenSecret string = "bbe35ad433dd8e67" - qrcodeCodeExpire int64 = 60 * 30 //15分钟过期 + + QrcodeCodeExpire int64 = 60 * 5 //5分钟过期 ) var aecSecret = []byte("mmm.qrcode.ecb.1") var qrcodeLogin = "/v1/auth/login/qrcode?key=" type QrcodeMessage struct { - jwt.StandardClaims Id string `json:"id"` Token string `json:"token"` IsLogin bool `json:"isLogin"` @@ -34,46 +34,20 @@ type QrcodeMessage struct { OrgId int64 `json:"orgId"` } -func (qrmsg *QrcodeMessage) GenerateImageBase64() ([]byte, error) { - nowTime := time.Now().Unix() - qrmsg.StandardClaims = jwt.StandardClaims{ - NotBefore: nowTime, - IssuedAt: nowTime, - ExpiresAt: nowTime + qrcodeCodeExpire, - Issuer: "allied_creation_gateway", - } - qrmsg.Id = fmt.Sprintf("%d", time.Now().UnixNano()) - token := jwt.NewWithClaims(jwt.SigningMethodHS256, *qrmsg) - str, err := token.SignedString([]byte(qrcodeTokenSecret)) - if err != nil { - return nil, err - } +func (qrmsg *QrcodeMessage) Init() ([]byte, error) { + str := strings.Replace(uuid.New().String(), "-", "", -1) key := constant.ALLIED_CREATION_GATEWAY_HOST + qrcodeLogin + str + log.Logger.Debug("key:" + key) encryptedData, err := openssl.AesECBEncrypt([]byte(key), aecSecret, openssl.PKCS7_PADDING) if err != nil { return nil, err } + qrmsg.Id = str qrmsg.Token = base64.StdEncoding.EncodeToString(encryptedData) qrmsg.IsLogin = false return encryptedData, err } -func (qrmsg *QrcodeMessage) ParseToken(str string) error { - tokenClaims, err := jwt.ParseWithClaims( - str, - qrmsg, - func(token *jwt.Token) (interface{}, error) { - return []byte(loginTokenSecret), nil - }) - if err != nil { - return err - } - if claim, ok := tokenClaims.Claims.(*QrcodeMessage); ok && tokenClaims.Valid { - *qrmsg = *claim - } - return nil -} - func (qrmsg *QrcodeMessage) BindUser(operator Operator) error { if qrmsg.IsLogin { return fmt.Errorf("登录中") diff --git a/pkg/infrastructure/cache/login_qrcode.go b/pkg/infrastructure/cache/login_qrcode.go index 61cdd96..96c2238 100644 --- a/pkg/infrastructure/cache/login_qrcode.go +++ b/pkg/infrastructure/cache/login_qrcode.go @@ -17,11 +17,7 @@ func (lq LoginQrcodeCache) keyString(str string) string { } func (lq LoginQrcodeCache) Save(qrcode domain.QrcodeMessage) error { - nowTime := time.Now().Unix() - exp := qrcode.ExpiresAt - nowTime - if exp <= 0 { - exp = 60 * 5 - } + var exp = domain.QrcodeCodeExpire key := lq.keyString(qrcode.Id) bt, _ := json.Marshal(qrcode) result := clientRedis.Set(key, string(bt), time.Duration(exp)*time.Second) -- libgit2 0.24.0