mirror of
https://gitee.com/XM-GO/PandaX.git
synced 2026-04-23 02:48:34 +08:00
优化设备认证逻辑
This commit is contained in:
@@ -12,6 +12,7 @@ import (
|
||||
type (
|
||||
DeviceModel interface {
|
||||
Insert(data entity.Device) *entity.Device
|
||||
FindOneByToken(token string) (*entity.Device, error)
|
||||
FindOne(id string) *entity.DeviceRes
|
||||
FindListPage(page, pageSize int, data entity.Device) (*[]entity.DeviceRes, int64)
|
||||
FindList(data entity.Device) *[]entity.DeviceRes
|
||||
@@ -35,13 +36,14 @@ func (m *deviceModelImpl) Insert(data entity.Device) *entity.Device {
|
||||
list := m.FindList(entity.Device{Name: data.Name})
|
||||
biz.IsTrue(list != nil && len(*list) == 0, "设备名称已经存在")
|
||||
//2 创建认证TOKEN IOTHUB使用
|
||||
etoken := getDeviceToken(&data)
|
||||
etoken, err := GetDeviceToken(&data)
|
||||
biz.ErrIsNil(err, "设备缓存失败")
|
||||
// 子网关不需要设置token
|
||||
if data.DeviceType != global.GATEWAYS {
|
||||
data.Token = etoken.Token
|
||||
}
|
||||
//3 添加设备
|
||||
err := tx.Table(m.table).Create(&data).Error
|
||||
err = tx.Table(m.table).Create(&data).Error
|
||||
biz.ErrIsNil(err, "添加设备失败")
|
||||
// 创建超级表 失败就
|
||||
err = createDeviceTable(data.Pid, data.Name)
|
||||
@@ -53,28 +55,6 @@ func (m *deviceModelImpl) Insert(data entity.Device) *entity.Device {
|
||||
return &data
|
||||
}
|
||||
|
||||
func getDeviceToken(data *entity.Device) *tool.DeviceAuth {
|
||||
now := time.Now()
|
||||
etoken := &tool.DeviceAuth{
|
||||
DeviceId: data.Id,
|
||||
OrgId: data.OrgId,
|
||||
Owner: data.Owner,
|
||||
Name: data.Name,
|
||||
DeviceType: data.DeviceType,
|
||||
ProductId: data.Pid,
|
||||
}
|
||||
//设备有效期360天
|
||||
etoken.CreatedAt = now.Unix()
|
||||
etoken.ExpiredAt = now.Add(time.Hour * 24 * 365).Unix()
|
||||
if data.Token == "" {
|
||||
etoken.Token = etoken.MD5ID()
|
||||
} else {
|
||||
etoken.Token = data.Token
|
||||
}
|
||||
biz.ErrIsNil(global.RedisDb.Set(data.Id, etoken.GetMarshal(), time.Hour*24*365), "Redis 存储失败")
|
||||
return etoken
|
||||
}
|
||||
|
||||
func (m *deviceModelImpl) FindOne(id string) *entity.DeviceRes {
|
||||
resData := new(entity.DeviceRes)
|
||||
db := global.Db.Table(m.table).Where("id = ?", id)
|
||||
@@ -83,6 +63,13 @@ func (m *deviceModelImpl) FindOne(id string) *entity.DeviceRes {
|
||||
return resData
|
||||
}
|
||||
|
||||
func (m *deviceModelImpl) FindOneByToken(token string) (*entity.Device, error) {
|
||||
resData := new(entity.Device)
|
||||
db := global.Db.Table(m.table).Where("token = ?", token)
|
||||
err := db.First(resData).Error
|
||||
return resData, err
|
||||
}
|
||||
|
||||
func (m *deviceModelImpl) FindListPage(page, pageSize int, data entity.Device) (*[]entity.DeviceRes, int64) {
|
||||
list := make([]entity.DeviceRes, 0)
|
||||
var total int64 = 0
|
||||
@@ -160,7 +147,8 @@ func (m *deviceModelImpl) FindList(data entity.Device) *[]entity.DeviceRes {
|
||||
}
|
||||
|
||||
func (m *deviceModelImpl) Update(data entity.Device) *entity.Device {
|
||||
getDeviceToken(&data)
|
||||
_, err := GetDeviceToken(&data)
|
||||
biz.ErrIsNil(err, "设备更改缓存失败")
|
||||
biz.ErrIsNil(global.Db.Table(m.table).Updates(&data).Error, "修改设备失败")
|
||||
return &data
|
||||
}
|
||||
@@ -205,3 +193,25 @@ func deleteDeviceTable(device string) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetDeviceToken(data *entity.Device) (*tool.DeviceAuth, error) {
|
||||
now := time.Now()
|
||||
etoken := &tool.DeviceAuth{
|
||||
DeviceId: data.Id,
|
||||
OrgId: data.OrgId,
|
||||
Owner: data.Owner,
|
||||
Name: data.Name,
|
||||
DeviceType: data.DeviceType,
|
||||
ProductId: data.Pid,
|
||||
}
|
||||
//设备有效期360天
|
||||
etoken.CreatedAt = now.Unix()
|
||||
etoken.ExpiredAt = now.Add(time.Hour * 24 * 365).Unix()
|
||||
if data.Token == "" {
|
||||
etoken.Token = etoken.MD5ID()
|
||||
} else {
|
||||
etoken.Token = data.Token
|
||||
}
|
||||
err := etoken.CreateDeviceToken(data.Id)
|
||||
return etoken, err
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package iothub
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"pandax/apps/device/services"
|
||||
exhook "pandax/iothub/protobuf"
|
||||
"pandax/pkg/global"
|
||||
"pandax/pkg/tool"
|
||||
@@ -16,7 +17,22 @@ func (s *HookService) auth(username, password string) bool {
|
||||
return true
|
||||
}
|
||||
etoken := &tool.DeviceAuth{}
|
||||
err := global.RedisDb.Get(username, etoken)
|
||||
// redis 中有就查询,没有就添加
|
||||
exists, err := global.RedisDb.Exists(global.RedisDb.Context(), username).Result()
|
||||
if exists == 1 {
|
||||
err = global.RedisDb.Get(username, etoken)
|
||||
} else {
|
||||
device, err := services.DeviceModelDao.FindOneByToken(password)
|
||||
if err != nil {
|
||||
global.Log.Infof("设备 %s 不存在", username)
|
||||
return false
|
||||
}
|
||||
etoken, err = services.GetDeviceToken(device)
|
||||
if err != nil {
|
||||
global.Log.Infof("设备%s添加缓存失败", username)
|
||||
return false
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
global.Log.Infof("invalid username %s", username)
|
||||
return false
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"pandax/pkg/global"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
type DeviceAuth struct {
|
||||
@@ -27,9 +28,8 @@ type DeviceAuth struct {
|
||||
ExpiredAt int64 `json:"expired_at"`
|
||||
}
|
||||
|
||||
func (entity *DeviceAuth) CreateDeviceToken() (err error) {
|
||||
|
||||
return nil
|
||||
func (entity *DeviceAuth) CreateDeviceToken(key string) (err error) {
|
||||
return global.RedisDb.Set(key, entity.GetMarshal(), time.Hour*24*365)
|
||||
}
|
||||
|
||||
func (entity *DeviceAuth) GetDeviceToken(key string) error {
|
||||
|
||||
Reference in New Issue
Block a user