feat: openid login
This commit is contained in:
@@ -2,18 +2,17 @@ package logic
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strconv"
|
||||
|
||||
"lone-services/pkg/modelbase"
|
||||
"lone-services/pkg/utils"
|
||||
"lone-services/pkg/validate"
|
||||
user "lone-services/rpc/user/pb"
|
||||
userconfig "lone-services/services/user/internal/config"
|
||||
"lone-services/services/user/internal/dao"
|
||||
"lone-services/services/user/internal/model"
|
||||
"lone-services/services/user/internal/svc"
|
||||
"lone-services/services/user/validator"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type LoginLogic struct {
|
||||
@@ -31,47 +30,64 @@ func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic
|
||||
}
|
||||
|
||||
func (l *LoginLogic) Login(in *user.LoginReq) (*user.Response, error) {
|
||||
var v validator.LoginValidator
|
||||
if msg := validate.ValidateFromProto(in, &v); msg != utils.StringEmpty {
|
||||
var req validator.LoginValidator
|
||||
if msg := validate.ValidateFromProto(in, &req); msg != utils.StringEmpty {
|
||||
return outResponse(utils.ErrorParams, msg), nil
|
||||
}
|
||||
|
||||
var cred dao.UserCredential
|
||||
credModel := model.UserCredentialModel{}.Init()
|
||||
if err := credModel.GetOne(modelbase.Params{
|
||||
Eq: map[string]string{
|
||||
"credential_type": dao.CredentialTypeOpenid,
|
||||
"identifier": v.Openid,
|
||||
"status": utils.StringStatusOk,
|
||||
},
|
||||
}, &cred); err != nil {
|
||||
l.Errorf("login by openid credential: %v", err)
|
||||
switch req.GrantType {
|
||||
case dao.GrantTypeOpenid:
|
||||
return l.loginByOpenid(req)
|
||||
case dao.GrantTypePassword:
|
||||
return outResponse(utils.ErrorParams, "密码登录暂未开放"), nil
|
||||
case dao.GrantTypeSms:
|
||||
return outResponse(utils.ErrorParams, "验证码登录暂未开放"), nil
|
||||
default:
|
||||
return outResponse(utils.ErrorParams, "不支持的登录方式"), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (l *LoginLogic) loginByOpenid(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 cred.Id < utils.NumberOne || cred.UserId < utils.NumberOne {
|
||||
if !clientAllowsGrant(client.AllowedGrants, dao.GrantTypeOpenid) {
|
||||
return outResponse(utils.ErrorParams, "该端不支持微信登录"), nil
|
||||
}
|
||||
|
||||
wxClient, cfgErr := userconfig.NewWechatClient(req.ClientCode)
|
||||
if cfgErr != nil {
|
||||
l.Errorf("login wechat config: %v", cfgErr)
|
||||
return outResponse(utils.Fail, "微信配置缺失"), nil
|
||||
}
|
||||
|
||||
session, wxErr := wxClient.Code2Session(req.Code)
|
||||
if wxErr != nil {
|
||||
l.Errorf("login code2session: %v", wxErr)
|
||||
return outResponse(utils.Fail, "微信登录失败"), nil
|
||||
}
|
||||
|
||||
userId, resolveErr := resolveOrCreateWechatUser(l.ctx, l.svcCtx.DB, session.OpenID, session.UnionID, req.ClientCode)
|
||||
if resolveErr != nil {
|
||||
l.Errorf("login resolve wechat user: %v", resolveErr)
|
||||
if st, ok := status.FromError(resolveErr); ok {
|
||||
return outResponse(utils.Fail, st.Message()), nil
|
||||
}
|
||||
return failResponse(utils.Fail), nil
|
||||
}
|
||||
|
||||
row, userErr := loadEnabledUser(userId)
|
||||
if userErr != nil {
|
||||
l.Errorf("login load user: %v", userErr)
|
||||
return failResponse(utils.ErrorNotFund), nil
|
||||
}
|
||||
|
||||
var row dao.UserRow
|
||||
userModel := model.UserModel{}.Init()
|
||||
if err := userModel.GetOne(modelbase.Params{
|
||||
Eq: map[string]string{
|
||||
"id": strconv.FormatInt(cred.UserId, utils.NumberTen),
|
||||
"status": utils.StringStatusOk,
|
||||
},
|
||||
}, &row); err != nil {
|
||||
l.Errorf("login by openid user: %v", err)
|
||||
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
|
||||
}
|
||||
if row.Id < utils.NumberOne {
|
||||
return failResponse(utils.ErrorNotFund), nil
|
||||
}
|
||||
|
||||
mobile := decryptMobile(row.Mobile)
|
||||
session := toSession(row, mobile)
|
||||
ret := buildToken(session)
|
||||
if status := setLogin(ret.Token, ret.Refresh, session); status.Code != utils.Ok.Code {
|
||||
return failResponse(status), nil
|
||||
}
|
||||
return okResponse(ret), nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user