81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
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")
|
||
}
|