Files
nbi_alarm/handle/service/login.go
2023-08-25 10:41:09 +08:00

81 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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("username-error")
}
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("username-error")
}
if user.AccountId != name {
return fmt.Errorf("username-error")
}
// 解析证书信息
certificate, err := utils.ParseCert(carCertificate)
if err != nil {
zlog.Ins().ErrorF("ParseCert Login[%s]:%s", name, err)
return fmt.Errorf("certificate-error")
}
// 判断证书到期时间
if time.Now().After(certificate.NotAfter) {
zlog.Ins().ErrorF("certificate Not After Now time Login[%s]:%s", name, err)
return errors.New("the certificate has expired")
}
// 判断证书持有人
if certificate.Subject.CommonName != name {
zlog.Ins().ErrorF("certificate Subject CommonName Login[%s]:%s", name, err)
return errors.New("the certificate cn-error")
}
// 解码base64得到签名字节串
signature, err := base64.StdEncoding.DecodeString(signatureBase64)
if err != nil {
zlog.Ins().ErrorF("signatureBase64 Login[%s]:%s", name, err)
return fmt.Errorf("the certificate signature-error")
}
// 验证签名
valid := utils.VerifySignature(certificate.PublicKey, []byte(content), signature)
if valid {
return nil
}
return errors.New("seqNo-error")
}