71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
package service
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
"omc/core/db"
|
|
"omc/core/utils"
|
|
"omc/handle/model"
|
|
|
|
"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, publicKeyStr, 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("无效用户名")
|
|
}
|
|
|
|
if user.AccountId != name {
|
|
return fmt.Errorf("用户名错误 %s", name)
|
|
}
|
|
|
|
// 公钥
|
|
publicKeyPEM := fmt.Sprintf("-----BEGIN RSA PUBLIC KEY-----\n %s \n-----END RSA PUBLIC KEY-----", publicKeyStr)
|
|
|
|
// 解析公钥
|
|
publicKey, err := utils.ParsePKCS1PublicKey(publicKeyPEM)
|
|
if err != nil {
|
|
zlog.Ins().ErrorF("publicKeyPEM Login[%s]:%s", name, err)
|
|
return fmt.Errorf("解析公钥失败")
|
|
}
|
|
|
|
// 解码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(publicKey, []byte(content), signature)
|
|
if valid {
|
|
return nil
|
|
}
|
|
return errors.New("随机码签名验证失败")
|
|
}
|