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  }