github.com/glide-im/glide@v1.6.0/internal/message_handler/auth.go (about) 1 package message_handler 2 3 import ( 4 "errors" 5 messages2 "github.com/glide-im/glide/im_service/messages" 6 "github.com/glide-im/glide/pkg/auth" 7 "github.com/glide-im/glide/pkg/auth/jwt_auth" 8 "github.com/glide-im/glide/pkg/gate" 9 "github.com/glide-im/glide/pkg/logger" 10 "github.com/glide-im/glide/pkg/messages" 11 ) 12 13 type AuthRequest struct { 14 } 15 16 func (d *MessageHandler) handleAuth(c *gate.Info, msg *messages.GlideMessage) error { 17 18 t := auth.Token{} 19 e := msg.Data.Deserialize(&t) 20 if e != nil { 21 resp := messages.NewMessage(0, messages2.ActionApiFailed, "invalid token") 22 d.enqueueMessage(c.ID, resp) 23 return nil 24 } 25 26 info := jwt_auth.JwtAuthInfo{ 27 UID: msg.From, 28 Device: c.ID.Device(), 29 } 30 r, err := d.auth.Auth(&info, &t) 31 32 if err != nil { 33 return err 34 } 35 36 if r.Success { 37 respMsg := messages.NewMessage(msg.Seq, messages2.ActionApiSuccess, r.Response) 38 jwtResp, ok := r.Response.(*jwt_auth.Response) 39 if !ok { 40 resp := messages.NewMessage(msg.Seq, messages2.ActionApiFailed, "internal error") 41 d.enqueueMessage(c.ID, resp) 42 return errors.New("invalid response type: expected *jwt_auth.Response") 43 } 44 45 newID := gate.NewID("", jwtResp.Uid, jwtResp.Device) 46 err = d.def.GetClientInterface().SetClientID(c.ID, newID) 47 if gate.IsIDAlreadyExist(err) { 48 tempId, err := gate.GenTempID(newID.Gateway()) 49 if err != nil { 50 return err 51 } 52 err = d.def.GetClientInterface().SetClientID(newID, tempId) 53 if err != nil { 54 return errors.New("failed to set temp id:" + err.Error()) 55 } 56 d.enqueueMessage(tempId, messages2.CreateKickOutMessage(c)) 57 err = d.def.GetClientInterface().SetClientID(c.ID, newID) 58 if err != nil { 59 return errors.New("failed to set new id:" + err.Error()) 60 } 61 } else if gate.IsClientNotExist(err) { 62 return errors.New("auth client not exist") 63 } else if err != nil { 64 return err 65 } 66 67 logger.D("auth success: %s", newID) 68 d.enqueueMessage(newID, respMsg) 69 } else { 70 resp := messages.NewMessage(msg.Seq, messages2.ActionApiFailed, r.Msg) 71 d.enqueueMessage(c.ID, resp) 72 } 73 return nil 74 }