github.com/qiniu/go-sdk/v7@v7.27.0/linking/dtoken.go (about) 1 package linking 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "time" 7 ) 8 9 type Statement struct { 10 Action string `json:"action"` 11 } 12 13 // 设备访问凭证 14 type DeviceAccessToken struct { 15 Appid string `json:"appid"` // appId 16 Device string `json:"device"` // device name 17 DeadLine int64 `json:"deadline"` // 该token的有效期截止时间 18 Random int64 `json:"random"` // 随机数,保证DEVICE ACCESS TOKEN全局唯一 19 Statement []Statement `json:"statement"` // 针对那种功能进行授权 20 } 21 22 func (manager *Manager) deviceToken(policy *DeviceAccessToken) (string, error) { 23 putPolicy, err := json.Marshal(policy) 24 if err != nil { 25 return "", err 26 } 27 encodedDeviceAccessToken := base64.URLEncoding.EncodeToString(putPolicy) 28 sign := manager.mac.Sign([]byte(encodedDeviceAccessToken)) 29 token := sign + ":" + encodedDeviceAccessToken 30 return token, nil 31 } 32 33 // 视频回放/缩略图查询/倍速播放/延时直播/视频片段查询 Token 34 func (manager *Manager) VodToken(appid, device string, deadline int64) (string, error) { 35 policy := &DeviceAccessToken{ 36 Appid: appid, 37 Device: device, 38 DeadLine: deadline, 39 Random: time.Now().UnixNano(), 40 Statement: []Statement{{Action: "linking:vod"}}, 41 } 42 return manager.deviceToken(policy) 43 } 44 45 // 在线记录查询/设备查询 Token 46 func (manager *Manager) StatusToken(appid, device string, deadline int64) (string, error) { 47 policy := &DeviceAccessToken{ 48 Appid: appid, 49 Device: device, 50 DeadLine: deadline, 51 Random: time.Now().UnixNano(), 52 Statement: []Statement{{Action: "linking:status"}}, 53 } 54 return manager.deviceToken(policy) 55 } 56 57 func (manager *Manager) Token(appid, device string, deadline int64, actions []Statement) (string, error) { 58 policy := &DeviceAccessToken{ 59 Appid: appid, 60 Device: device, 61 DeadLine: deadline, 62 Random: time.Now().UnixNano(), 63 Statement: actions, 64 } 65 return manager.deviceToken(policy) 66 }