Ejemplo n.º 1
0
Archivo: token.go Proyecto: xtfly/goman
func (ut *UserToken) DecodeToken(crypto *gokits.Crypto, token string) bool {
	bs, err := base64.URLEncoding.DecodeString(token)
	if err != nil {
		return false
	}

	// decrypt
	var tbs []byte
	tbs, err = crypto.Decrypt(bs)
	if err != nil {
		log.Error("Decrypt failed ", err.Error())
		return false
	}

	// check the len
	if l := len(tbs); l != TokenLen {
		log.Error("Invalid length ", l)
		return false
	}

	ut.Flag = TokenFlag(tbs[0])
	// remain bytes
	buf := bytes.NewReader(tbs[1:])

	// read uid
	if err := binary.Read(buf, binary.BigEndian, &ut.Uid); err != nil {
		log.Error("Read uid failed ", err.Error())
		return false
	}

	// ip
	ip := make([]byte, 4)
	buf.Read(ip)
	ut.ClientIP = net.IP(ip).String()
	//log.Info("token ip  ", ut.ClientIP)

	// gen time
	if err := binary.Read(buf, binary.BigEndian, &ut.GenTime); err != nil {
		log.Error("Read generate time failed ", err.Error())
		return false
	}

	// expire time
	if err := binary.Read(buf, binary.BigEndian, &ut.Expire); err != nil {
		log.Error("Read expire time failed ", err.Error())
		return false
	}

	return true
}