github.com/simpleiot/simpleiot@v0.18.3/client/auth.go (about) 1 package client 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/nats-io/nats.go" 8 "github.com/simpleiot/simpleiot/data" 9 ) 10 11 // UserCheck sends a nats message to check auth of user 12 // This function returns user nodes and a JWT node which includes a token 13 func UserCheck(nc *nats.Conn, email, pass string) ([]data.NodeEdge, error) { 14 points := data.Points{ 15 {Type: data.PointTypeEmail, Text: email, Key: "0"}, 16 {Type: data.PointTypePass, Text: pass, Key: "0"}, 17 } 18 19 pointsData, err := points.ToPb() 20 if err != nil { 21 return []data.NodeEdge{}, err 22 } 23 24 nodeMsg, err := nc.Request("auth.user", pointsData, time.Second*20) 25 if err != nil { 26 return []data.NodeEdge{}, err 27 } 28 29 nodes, err := data.PbDecodeNodesRequest(nodeMsg.Data) 30 31 if err != nil { 32 return []data.NodeEdge{}, err 33 } 34 35 return nodes, nil 36 } 37 38 // GetNatsURI returns the nats URI and auth token for the SIOT server 39 // this can be used to set up new NATS connections with different requirements 40 // (no echo, etc) 41 // return URI, authToken, error 42 func GetNatsURI(nc *nats.Conn) (string, string, error) { 43 resp, err := nc.Request("auth.getNatsURI", nil, time.Second*1) 44 45 if err != nil { 46 return "", "", err 47 } 48 49 points, err := data.PbDecodePoints(resp.Data) 50 if err != nil { 51 return "", "", err 52 } 53 54 var uri, token string 55 56 for _, p := range points { 57 switch p.Type { 58 case data.PointTypeURI: 59 uri = p.Text 60 case data.PointTypeToken: 61 token = p.Text 62 } 63 } 64 65 if uri == "" { 66 return "", "", errors.New("URI not returned") 67 } 68 69 return uri, token, nil 70 }