package service import ( "encoding/base64" "errors" "fmt" "omc/core/db" "omc/core/utils" "omc/handle/model" "time" "github.com/aceld/zinx/zlog" ) // UserLogin 用户登录 func UserLogin(name, passwd string) error { // 用户名密码校验 var user model.User err := db.Client.Model(&model.User{}).Where("account_id=?", name).First(&user).Error if err != nil { zlog.Ins().ErrorF("Password Login[%s]:%s", name, err) return errors.New("incorrect username and password") } if err := utils.Compare(user.Password, passwd); err != nil { zlog.Ins().ErrorF("Password Login[%s]:%s", name, err) return errors.New("incorrect username and password") } return nil } // CMCALogin 验证随机码 // content "user:seqNo" 组合的字符 // signatureBase64 签名数据(base64编码) func CMCALogin(name, carCertificate, content, signatureBase64 string) error { // 用户名密码校验 var user model.User err := db.Client.Model(&model.User{}).Where("account_id=?", name).First(&user).Error if err != nil { zlog.Ins().ErrorF("Password Login[%s]:%s", name, err) return errors.New("无效OMC用户") } if user.AccountId != name { return fmt.Errorf("用户名错误 %s", name) } // 解析证书信息 certificate, err := utils.ParseCert(carCertificate) if err != nil { zlog.Ins().ErrorF("ParseCert Login[%s]:%s", name, err) return fmt.Errorf("解析证书失败") } // 判断证书到期时间 if time.Now().After(certificate.NotAfter) { zlog.Ins().ErrorF("certificate Not After Now time Login[%s]:%s", name, err) return errors.New("证书已过期") } // 判断证书持有人 if certificate.Subject.CommonName != name { zlog.Ins().ErrorF("certificate Subject CommonName Login[%s]:%s", name, err) return errors.New("用户与证书持有人不匹配") } // 解码base64得到签名字节串 signature, err := base64.StdEncoding.DecodeString(signatureBase64) if err != nil { zlog.Ins().ErrorF("signatureBase64 Login[%s]:%s", name, err) return fmt.Errorf("解码签名数据失败") } // 验证签名 valid := utils.VerifySignature(certificate.PublicKey, []byte(content), signature) if valid { return nil } return errors.New("随机码签名验证失败") }