github.com/qiniu/go-sdk/v7@v7.27.0/storage/token.go (about)

     1  package storage
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"time"
     7  
     8  	"github.com/qiniu/go-sdk/v7/auth"
     9  	"github.com/qiniu/go-sdk/v7/storagev2/uptoken"
    10  )
    11  
    12  // PutPolicy 表示文件上传的上传策略,参考 https://developer.qiniu.com/kodo/manual/1206/put-policy
    13  type PutPolicy struct {
    14  	// 指定上传的目标资源空间 Bucket 和资源键 Key(最大为 750 字节)。有三种格式:
    15  	// <bucket>,表示允许用户上传文件到指定的 bucket。在这种格式下文件只能新增(分片上传 v1 版 需要指定 insertOnly 为 1 才是新增,否则也为覆盖上传),若已存在同名资源(且文件内容/etag不一致),上传会失败;若已存在资源的内容/etag一致,则上传会返回成功。
    16  	// <bucket>:<key>,表示只允许用户上传指定 key 的文件。在这种格式下文件默认允许修改,若已存在同名资源则会被覆盖。如果只希望上传指定 key 的文件,并且不允许修改,那么可以将下面的 insertOnly 属性值设为 1。
    17  	// <bucket>:<keyPrefix>,表示只允许用户上传指定以 keyPrefix 为前缀的文件,当且仅当 isPrefixalScope 字段为 1 时生效,isPrefixalScope 为 1 时无法覆盖上传。
    18  	Scope string `json:"scope"`
    19  
    20  	// 若为 1,表示允许用户上传以 scope 的 keyPrefix 为前缀的文件。
    21  	IsPrefixalScope int `json:"isPrefixalScope,omitempty"`
    22  
    23  	// 上传凭证有效截止时间。Unix时间戳,单位为秒。该截止时间为上传完成后,在七牛空间生成文件的校验时间,而非上传的开始时间,
    24  	// 一般建议设置为上传开始时间 + 3600s,用户可根据具体的业务场景对凭证截止时间进行调整。
    25  	Expires uint64 `json:"deadline"`
    26  
    27  	// 若非0, 即使Scope为 Bucket:Key 的形式也是insert only
    28  	InsertOnly uint16 `json:"insertOnly,omitempty"`
    29  
    30  	// 唯一属主标识。特殊场景下非常有用,例如根据 App-Client 标识给图片或视频打水印。
    31  	EndUser string `json:"endUser,omitempty"`
    32  
    33  	// Web 端文件上传成功后,浏览器执行 303 跳转的 URL。通常用于表单上传。
    34  	// 文件上传成功后会跳转到 <returnUrl>?upload_ret=<queryString>,<queryString>包含 returnBody 内容。
    35  	// 如不设置 returnUrl,则直接将 returnBody 的内容返回给客户端。
    36  	ReturnURL string `json:"returnUrl,omitempty"`
    37  
    38  	// 上传成功后,自定义七牛云最终返回給上传端(在指定 returnUrl 时是携带在跳转路径参数中)的数据。支持魔法变量和自定义变量。
    39  	// returnBody 要求是合法的 JSON 文本。
    40  	// 例如 {“key”: $(key), “hash”: $(etag), “w”: $(imageInfo.width), “h”: $(imageInfo.height)}。
    41  	ReturnBody string `json:"returnBody,omitempty"`
    42  
    43  	// 上传成功后,七牛云向业务服务器发送 POST 请求的 URL。必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL。
    44  	// 另外,为了给客户端有一致的体验,我们要求 callbackUrl 返回包 Content-Type 为 “application/json”,即返回的内容必须是合法的
    45  	// JSON 文本。出于高可用的考虑,本字段允许设置多个 callbackUrl(用英文符号 ; 分隔),在前一个 callbackUrl 请求失败的时候会依次
    46  	// 重试下一个 callbackUrl。一个典型例子是:http://<ip1>/callback;http://<ip2>/callback,并同时指定下面的 callbackHost 字段。
    47  	// 在 callbackUrl 中使用 ip 的好处是减少对 dns 解析的依赖,可改善回调的性能和稳定性。指定 callbackUrl,必须指定 callbackbody,
    48  	// 且值不能为空。
    49  	CallbackURL string `json:"callbackUrl,omitempty"`
    50  
    51  	// 上传成功后,七牛云向业务服务器发送回调通知时的 Host 值。与 callbackUrl 配合使用,仅当设置了 callbackUrl 时才有效。
    52  	CallbackHost string `json:"callbackHost,omitempty"`
    53  
    54  	// 上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求。业务服务器可以通过直接读取
    55  	// 请求的 query 来获得该字段,支持魔法变量和自定义变量。callbackBody 要求是合法的 url query string。
    56  	// 例如key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)。如果callbackBodyType指定为application/json,
    57  	// 则callbackBody应为json格式,例如:{“key”:"$(key)",“hash”:"$(etag)",“w”:"$(imageInfo.width)",“h”:"$(imageInfo.height)"}。
    58  	CallbackBody string `json:"callbackBody,omitempty"`
    59  
    60  	// 上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type。默认为 application/x-www-form-urlencoded,也可设置
    61  	// 为 application/json。
    62  	CallbackBodyType string `json:"callbackBodyType,omitempty"`
    63  
    64  	// 资源上传成功后触发执行的预转持久化处理指令列表。fileType=2或3(上传归档存储或深度归档存储文件)时,不支持使用该参数。支持魔法变量和自
    65  	// 定义变量。每个指令是一个 API 规格字符串,多个指令用;分隔。请参阅persistenOps详解与示例。同时添加 persistentPipeline 字段,使用专
    66  	// 用队列处理,请参阅persistentPipeline。
    67  	PersistentOps string `json:"persistentOps,omitempty"`
    68  
    69  	// 接收持久化处理结果通知的 URL。必须是公网上可以正常进行 POST 请求并能响应 HTTP/1.1 200 OK 的有效 URL。该 URL 获取的内容和持久化处
    70  	// 理状态查询的处理结果一致。发送 body 格式是 Content-Type 为 application/json 的 POST 请求,需要按照读取流的形式读取请求的 body
    71  	// 才能获取。
    72  	PersistentNotifyURL string `json:"persistentNotifyUrl,omitempty"`
    73  
    74  	// 转码队列名。资源上传成功后,触发转码时指定独立的队列进行转码。为空则表示使用公用队列,处理速度比较慢。建议使用专用队列。
    75  	PersistentPipeline string `json:"persistentPipeline,omitempty"`
    76  
    77  	// 任务类型。0: 普通任务,1: 闲时任务
    78  	PersistentType int64 `json:"persistentType,omitempty"`
    79  
    80  	// 工作流模版 ID
    81  	PersistentWorkflowTemplateID string `json:"persistentWorkflowTemplateID,omitempty"`
    82  
    83  	// saveKey 的优先级设置。为 true 时,saveKey不能为空,会忽略客户端指定的key,强制使用saveKey进行文件命名。参数不设置时,
    84  	// 默认值为false
    85  	ForceSaveKey bool `json:"forceSaveKey,omitempty"` //
    86  
    87  	// 自定义资源名。支持魔法变量和自定义变量。forceSaveKey 为false时,这个字段仅当用户上传的时候没有主动指定 key 时起作用;
    88  	// forceSaveKey 为true时,将强制按这个字段的格式命名。
    89  	SaveKey string `json:"saveKey,omitempty"`
    90  
    91  	// 限定上传文件大小最小值,单位Byte。小于限制上传文件大小的最小值会被判为上传失败,返回 403 状态码
    92  	FsizeMin int64 `json:"fsizeMin,omitempty"`
    93  
    94  	// 限定上传文件大小最大值,单位Byte。超过限制上传文件大小的最大值会被判为上传失败,返回 413 状态码。
    95  	FsizeLimit int64 `json:"fsizeLimit,omitempty"`
    96  
    97  	// 开启 MimeType 侦测功能,并按照下述规则进行侦测;如不能侦测出正确的值,会默认使用 application/octet-stream 。
    98  	// 默认设为 0 时:如上传端指定了 MimeType 则直接使用该值,否则按如下顺序侦测 MimeType 值:
    99  	//		1. 检查文件扩展名;
   100  	//		2. 检查 Key 扩展名;
   101  	//		3. 侦测内容。
   102  	// 设为 1 时:则忽略上传端传递的文件 MimeType 信息,并按如下顺序侦测 MimeType 值:
   103  	//		1. 侦测内容;
   104  	//		2. 检查文件扩展名;
   105  	//		3. 检查 Key 扩展名。
   106  	// 设为 -1 时:无论上传端指定了何值直接使用该值。
   107  	DetectMime int `json:"detectMime,omitempty"`
   108  
   109  	// 限定用户上传的文件类型。指定本字段值,七牛服务器会侦测文件内容以判断 MimeType,再用判断值跟指定值进行匹配,匹配成功则允许上传,匹配失败则返回 403 状态码。示例:
   110  	// image/* 表示只允许上传图片类型
   111  	// image/jpeg;image/png 表示只允许上传 jpg 和 png 类型的图片
   112  	// !application/json;text/plain 表示禁止上传 json 文本和纯文本。注意最前面的感叹号!
   113  	MimeLimit string `json:"mimeLimit,omitempty"`
   114  
   115  	// 资源的存储类型,0表示标准存储,1 表示低频存储,2 表示归档存储,3 表示深度归档存储,4 表示归档直读存储。
   116  	FileType int `json:"fileType,omitempty"`
   117  
   118  	CallbackFetchKey uint8 `json:"callbackFetchKey,omitempty"`
   119  
   120  	DeleteAfterDays int `json:"deleteAfterDays,omitempty"`
   121  
   122  	// 上传单链接限速,单位:bit/s;范围:819200 - 838860800(即800Kb/s - 800Mb/s),如果超出该范围将返回 400 错误
   123  	TrafficLimit uint64 `json:"trafficLimit,omitempty"`
   124  
   125  	// 同步转码命令,不推荐使用
   126  	Transform string `json:"transform,omitempty"`
   127  
   128  	// 同步转码降级模式,不推荐使用。 缺省: 不降级 (默认); ORIGIN 保存原始内容;
   129  	TransformFallbackMode string `json:"transformFallbackMode,omitempty"`
   130  
   131  	// 同步转码降级 Key,不推荐使用。 transformFallbackMode 为 ORIGIN 时必填。
   132  	TransformFallbackKey string `json:"transformFallbackKey,omitempty"`
   133  }
   134  
   135  // UploadToken 方法用来进行上传凭证的生成
   136  // 该方法生成的过期时间是现对于现在的时间
   137  func (p *PutPolicy) UploadToken(cred *auth.Credentials) string {
   138  	return p.uploadToken(cred)
   139  }
   140  
   141  func (p PutPolicy) uploadToken(cred *auth.Credentials) (token string) {
   142  	if p.Expires == 0 {
   143  		p.Expires = 3600 // 默认一小时过期
   144  	}
   145  	p.Expires += uint64(time.Now().Unix())
   146  	putPolicyJSON, _ := json.Marshal(p)
   147  	token = cred.SignWithData(putPolicyJSON)
   148  	return
   149  }
   150  
   151  func getAkBucketFromUploadToken(token string) (ak, bucket string, err error) {
   152  	parser := uptoken.NewParser(token)
   153  	if ak, err = parser.GetAccessKey(context.Background()); err != nil {
   154  		return
   155  	}
   156  	upPolicy, err := parser.GetPutPolicy(context.Background())
   157  	if err != nil {
   158  		return
   159  	}
   160  	bucket, err = upPolicy.GetBucketName()
   161  	return
   162  }