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  }