feat: passwork login
This commit is contained in:
@@ -35,6 +35,7 @@ require (
|
||||
filippo.io/edwards25519 v1.2.0 // indirect
|
||||
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect
|
||||
github.com/alibabacloud-go/debug v1.0.1 // indirect
|
||||
github.com/alibabacloud-go/dysmsapi-20180501/v2 v2.0.8 // indirect
|
||||
github.com/aliyun/credentials-go v1.4.13 // indirect
|
||||
github.com/antlr4-go/antlr/v4 v4.13.0 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
|
||||
@@ -30,6 +30,8 @@ github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6p
|
||||
github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc=
|
||||
github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg=
|
||||
github.com/alibabacloud-go/debug v1.0.1/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc=
|
||||
github.com/alibabacloud-go/dysmsapi-20180501/v2 v2.0.8 h1:aDPyz6C+nenypx24N5qEt09NjpS6mu7Cu1A+wf9UTaY=
|
||||
github.com/alibabacloud-go/dysmsapi-20180501/v2 v2.0.8/go.mod h1:e/vWJ5gLVnraPROSh+3oMSodf5ukaUlqNgH0IIcnz98=
|
||||
github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q=
|
||||
github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE=
|
||||
github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY=
|
||||
|
||||
@@ -4,6 +4,7 @@ package chore;
|
||||
option go_package = "lone-services/rpc/chore";
|
||||
import "google/api/annotations.proto";
|
||||
|
||||
// 应放到pkg
|
||||
service Chore {
|
||||
rpc Policy(PolicyReq) returns (Response) {
|
||||
option (google.api.http) = {
|
||||
|
||||
@@ -68,6 +68,21 @@ func findCredential(credentialType, identifier string) (*dao.UserCredential, err
|
||||
return &cred, nil
|
||||
}
|
||||
|
||||
func userHasEnabledClient(userId int64, clientCode string) (bool, error) {
|
||||
var row dao.UserClient
|
||||
clientModel := model.UserClientModel{}.Init()
|
||||
if err := clientModel.GetOne(modelbase.Params{
|
||||
Eq: map[string]string{
|
||||
"user_id": strconv.FormatInt(userId, utils.NumberTen),
|
||||
"client_code": clientCode,
|
||||
"status": strconv.Itoa(int(dao.StatusEnabled)),
|
||||
},
|
||||
}, &row); err != nil {
|
||||
return false, err
|
||||
}
|
||||
return row.Id >= utils.NumberOne, nil
|
||||
}
|
||||
|
||||
func loadEnabledUser(userId int64) (*dao.UserRow, error) {
|
||||
var row dao.UserRow
|
||||
userModel := model.UserModel{}.Init()
|
||||
|
||||
@@ -39,7 +39,7 @@ func (l *LoginLogic) Login(in *user.LoginReq) (*user.Response, error) {
|
||||
case dao.GrantTypeOpenid:
|
||||
return l.loginByOpenid(req)
|
||||
case dao.GrantTypePassword:
|
||||
return outResponse(utils.ErrorParams, "密码登录暂未开放"), nil
|
||||
return l.loginByPassword(req)
|
||||
case dao.GrantTypeSms:
|
||||
return outResponse(utils.ErrorParams, "验证码登录暂未开放"), nil
|
||||
default:
|
||||
@@ -91,3 +91,60 @@ func (l *LoginLogic) loginByOpenid(req validator.LoginValidator) (*user.Response
|
||||
}
|
||||
return okResponse(ret), nil
|
||||
}
|
||||
|
||||
func (l *LoginLogic) loginByPassword(req validator.LoginValidator) (*user.Response, error) {
|
||||
client, err := loadEnabledClient(req.ClientCode)
|
||||
if err != nil {
|
||||
l.Errorf("login load client: %v", err)
|
||||
return failResponse(utils.Fail), nil
|
||||
}
|
||||
if !clientAllowsGrant(client.AllowedGrants, dao.GrantTypePassword) {
|
||||
return outResponse(utils.ErrorParams, "该端不支持密码登录"), nil
|
||||
}
|
||||
|
||||
if len(req.Mobile) != utils.NumberEleven {
|
||||
return failResponse(utils.ErrorMobileError), nil
|
||||
}
|
||||
encryptMobile, encErr := utils.EncryptPhone(req.Mobile)
|
||||
if encErr != nil {
|
||||
l.Errorf("login encrypt mobile: %v", encErr)
|
||||
return failResponse(utils.ErrorEncryptAesError), nil
|
||||
}
|
||||
|
||||
cred, credErr := findCredential(dao.CredentialTypePassword, encryptMobile)
|
||||
if credErr != nil {
|
||||
l.Errorf("login find credential: %v", credErr)
|
||||
return failResponse(utils.Fail), nil
|
||||
}
|
||||
if cred == nil {
|
||||
return failResponse(utils.ErrorNotFund), nil
|
||||
}
|
||||
if cred.Status == dao.StatusDisabled {
|
||||
return outResponse(utils.Fail, "登录凭证已禁用"), nil
|
||||
}
|
||||
if !utils.EqualsPassword(req.Password, cred.Secret) {
|
||||
return failResponse(utils.ErrorPwdError), nil
|
||||
}
|
||||
|
||||
hasClient, clientErr := userHasEnabledClient(cred.UserId, req.ClientCode)
|
||||
if clientErr != nil {
|
||||
l.Errorf("login check user client: %v", clientErr)
|
||||
return failResponse(utils.Fail), nil
|
||||
}
|
||||
if !hasClient {
|
||||
return outResponse(utils.ErrorParams, "该端未开通或已禁用"), nil
|
||||
}
|
||||
|
||||
row, userErr := loadEnabledUser(cred.UserId)
|
||||
if userErr != nil {
|
||||
l.Errorf("login load user: %v", userErr)
|
||||
return failResponse(utils.ErrorNotFund), nil
|
||||
}
|
||||
|
||||
ret, tokenErr := issueLoginToken(l.ctx, l.svcCtx.JWT, l.svcCtx.SaleSvcName, row, client)
|
||||
if tokenErr != nil {
|
||||
l.Errorf("login issue token: %v", tokenErr)
|
||||
return failResponse(utils.Fail), nil
|
||||
}
|
||||
return okResponse(ret), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user