diff --git a/messaging/Contexts.go b/messaging/Contexts.go index c9a443d..6e25b70 100644 --- a/messaging/Contexts.go +++ b/messaging/Contexts.go @@ -10,6 +10,7 @@ type Contexts struct { connections map[string]*neffos.NSConn callbacksOfAdd []func(string, *neffos.NSConn) callbacksOfRemove []func(string) + authenticator func(map[string]string) (string, error) } func newContexts() *Contexts { @@ -41,7 +42,12 @@ func (contexts *Contexts) remove(id string) { func (contexts *Contexts) Get(id string) *neffos.NSConn { locker.RLock() defer locker.RUnlock() - return contexts.connections[id] + connection, ok := contexts.connections[id] + if ok { + return connection + } else { + return nil + } } func (contexts *Contexts) OnAdd(callback func(string, *neffos.NSConn)) { @@ -55,3 +61,7 @@ func (contexts *Contexts) OnRemove(callback func(string)) { defer locker.Unlock() contexts.callbacksOfRemove = append(contexts.callbacksOfRemove, callback) } + +func (contexts *Contexts) SetAuthenticator(authenticator func(map[string]string) (string, error)) { + contexts.authenticator = authenticator +} diff --git a/messaging/messaging.go b/messaging/messaging.go index 09c30e9..6b3e5fa 100644 --- a/messaging/messaging.go +++ b/messaging/messaging.go @@ -1,6 +1,7 @@ package messaging import ( + "encoding/json" "fmt" gorilla_websocket "github.com/gorilla/websocket" "github.com/kataras/iris/v12/core/router" @@ -32,8 +33,28 @@ func Register(namespaceName string, eventMapping neffos.Events) *Contexts { return nil } eventMapping["login"] = func(connection *neffos.NSConn, message neffos.Message) error { - fmt.Println("login:" + string(message.Body)) - contexts.add(connection.Conn.ID(), connection) + var headers map[string]string + if err := json.Unmarshal(message.Body, &headers); err != nil { + panic(err) + } + token, ok := headers["token"] + if !ok { + jsonText, _ := json.Marshal(map[string]string{"err": "未找到token!"}) + connection.Emit("onLogin", jsonText) + return nil + } + delete(headers, "token") + fmt.Println(token) + id := connection.Conn.ID() // Todo 需要根据 token 解析出 user id + if contexts.authenticator != nil { + var err error + id, err = contexts.authenticator(headers) + if err != nil { + jsonText, _ := json.Marshal(map[string]string{"err": err.Error()}) + connection.Emit("onLogin", jsonText) + } + } + contexts.add(id, connection) connection.Emit("onLogin", []byte{}) return nil }