appserver

package module
v0.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 16, 2025 License: MIT Imports: 16 Imported by: 0

README

English | 简体中文

aliyun-oss-appserver-go

Upload data to OSS through Web applications. Add signatures on the server, configure upload callback, and directly transfer data.

Installation

go get -u github.com/alphasnow/aliyun-oss-appserver-go

Usage

Token generate
token := appserver.NewToken(&appserver.Config{
    AccessKeyId:     "yourAccessKeyId",
    AccessKeySecret: "yourAccessKeySecret",
    Host:            "https://bucket-name.oss-cn-hangzhou.aliyuncs.com",
    Directory:       "user-dir-prefix/",
    ExpireSecond:    600,
    // Only the PutObject, PostObject, and CompleteMultipartUpload support Callback
    CallbackUrl:     "http://domain.com/oss/callback", 
})
postToken, _ := token.Generate()
postTokenJson, _ := json.Marshal(postToken)
//{
//    "OSSAccessKeyId": "yourAccessKeyId",
//    "policy": "eyJleHBpcmF0aW9uIjoiMjAyNS0wMS0wMVQwMDowMDowMFoiLCJjb25kaXRpb25zIjpbWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJ1c2VyLWRpci1wcmVmaXgvIl1dfQ==",
//    "callback": "eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9kb21haW4uY29tL29zcy9jYWxsYmFjayIsImNhbGxiYWNrQm9keSI6IntcImJ1Y2tldFwiOiR7YnVja2V0fSxcIm9iamVjdFwiOiR7b2JqZWN0fSxcImV0YWdcIjoke2V0YWd9LFwic2l6ZVwiOiR7c2l6ZX0sXCJtaW1lVHlwZVwiOiR7bWltZVR5cGV9LFwiaW1hZ2VJbmZvXCI6e1wiaGVpZ2h0XCI6JHtpbWFnZUluZm8uaGVpZ2h0fSxcIndpZHRoXCI6JHtpbWFnZUluZm8ud2lkdGh9LFwiZm9ybWF0XCI6JHtpbWFnZUluZm8uZm9ybWF0fX0sXCJjcmM2NFwiOiR7Y3JjNjR9LFwiY29udGVudE1kNVwiOiR7Y29udGVudE1kNX0sXCJ2cGNJZFwiOiR7dnBjSWR9LFwiY2xpZW50SXBcIjoke2NsaWVudElwfSxcInJlcUlkXCI6JHtyZXFJZH0sXCJvcGVyYXRpb25cIjoke29wZXJhdGlvbn19IiwiY2FsbGJhY2tCb2R5VHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifQ==",
//    "signature": "uXL82wU5IGCd7vcZKX9gua5TUJs=",
//    "host": "https://bucket-name.oss-cn-hangzhou.aliyuncs.com",
//    "expire": 1735689600,
//    "directory": "user-dir-prefix/"
//}

Upload file

curl --location "https://bucket-name.oss-cn-hangzhou.aliyuncs.com" \
--form 'key="user-dir-prefix/${filename}"' \
--form 'policy="eyJleHBpcmF0aW9uIjoiMjAyNS0wMS0wMVQwMDowMDowMFoiLCJjb25kaXRpb25zIjpbWyJzdGFydHMtd2l0aCIsIiRrZXkiLCJ1c2VyLWRpci1wcmVmaXgvIl1dfQ=="' \
--form 'OSSAccessKeyId="yourAccessKeyId"' \
--form 'callback="eyJjYWxsYmFja1VybCI6Imh0dHA6Ly9kb21haW4uY29tL29zcy9jYWxsYmFjayIsImNhbGxiYWNrQm9keSI6IntcImJ1Y2tldFwiOiR7YnVja2V0fSxcIm9iamVjdFwiOiR7b2JqZWN0fSxcImV0YWdcIjoke2V0YWd9LFwic2l6ZVwiOiR7c2l6ZX0sXCJtaW1lVHlwZVwiOiR7bWltZVR5cGV9LFwiaW1hZ2VJbmZvXCI6e1wiaGVpZ2h0XCI6JHtpbWFnZUluZm8uaGVpZ2h0fSxcIndpZHRoXCI6JHtpbWFnZUluZm8ud2lkdGh9LFwiZm9ybWF0XCI6JHtpbWFnZUluZm8uZm9ybWF0fX0sXCJjcmM2NFwiOiR7Y3JjNjR9LFwiY29udGVudE1kNVwiOiR7Y29udGVudE1kNX0sXCJ2cGNJZFwiOiR7dnBjSWR9LFwiY2xpZW50SXBcIjoke2NsaWVudElwfSxcInJlcUlkXCI6JHtyZXFJZH0sXCJvcGVyYXRpb25cIjoke29wZXJhdGlvbn19IiwiY2FsbGJhY2tCb2R5VHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifQ=="' \
--form 'signature="uXL82wU5IGCd7vcZKX9gua5TUJs="' \
--form 'file=@"~/Downloads/image.jpg"'

Callback verify

aliyunOSSCallback := appserver.NewAliyunOSSCallback(request)
callbackBody,err := aliyunOSSCallback.VerifySignature()
//{
//    "bucket": "bucket-name",
//    "object": "user-dir-prefix/image.jpg",
//    "etag": "A3AC1B2FAADBD*****EE9F5EA57CAACB",
//    "size": 2788,
//    "mimeType": "image/jpeg",
//    "imageInfo": {
//        "height": 197,
//        "width": 257,
//        "format": "jpg"
//    },
//    "crc64": 34616313***72852000,
//    "contentMd5": "o6wbL6rb0***7p9epXyqyw==",
//    "vpcId": null,
//    "clientIp": "100.20.30.40",
//    "reqId": "674EB5AA2*****37341888F8",
//    "operation": "PutObject"
//}

Reference

Documentation

Index

Constants

View Source
const AuthorizationHeader = "Authorization"
View Source
const CallbackBodyParam = `` /* 317-byte string literal not displayed */
View Source
const CallbackBodyTypeParam = "application/json"
View Source
const DefaultExpireSecond = 600
View Source
const PubKeyUrlHeader = "X-Oss-Pub-Key-Url"
View Source
const TimeGMTISO8601 = "2006-01-02T15:04:05Z"

Variables

This section is empty.

Functions

func GetAuthorization

func GetAuthorization(strAuthorizationBase64 string) ([]byte, error)

GetAuthorization : decode from Base64String

func GetMD5FromNewAuthString

func GetMD5FromNewAuthString(bodyContent []byte, urlPath string, urlQuery string) ([]byte, error)

GetMD5FromNewAuthString : Get MD5 bytes from Newly Constructed Authorization String.

func GetPublicKey

func GetPublicKey(publicKeyURLBase64 string) ([]byte, error)

GetPublicKey : Get PublicKey bytes from Request.URL

func VerifySignature

func VerifySignature(bytePublicKey []byte, byteMd5 []byte, authorization []byte) error

Types

type AliyunOSSCallback added in v0.3.0

type AliyunOSSCallback struct {
	// contains filtered or unexported fields
}

func NewAliyunOSSCallback added in v0.3.0

func NewAliyunOSSCallback(req *http.Request) *AliyunOSSCallback

func (*AliyunOSSCallback) VerifySignature added in v0.3.0

func (a *AliyunOSSCallback) VerifySignature() (*CallbackBody, error)

type Callback added in v0.1.0

type Callback struct {
	CallbackUrl      string `json:"callbackUrl"`                // required
	CallbackBody     string `json:"callbackBody"`               // optional
	CallbackBodyType string `json:"callbackBodyType,omitempty"` // optional, default: application/x-www-form-urlencoded
}

Callback https://help.aliyun.com/zh/oss/developer-reference/callback

func (*Callback) Validate added in v0.4.0

func (c *Callback) Validate() error

type CallbackBody

type CallbackBody struct {
	// Bucket是存储空间名称
	Bucket string `json:"bucket"`
	// Object表示对象(文件)的完整路径
	Object string `json:"object"`
	// Etag是文件的ETag,即返回给用户的ETag字段
	Etag string `json:"etag"`
	// Size代表Object大小,调用CompleteMultipartUpload时,size为整个Object的大小
	Size int `json:"size"`
	// MimeType代表资源类型,例如jpeg图片的资源类型为image/jpeg
	MimeType string `json:"mimeType"`
	// ImageInfo用于存储图片相关的额外信息,仅适用于图片格式
	ImageInfo ImageInfo `json:"imageInfo"`
	// Crc64与上传文件后返回的x-oss-hash-crc64ecma头内容一致
	Crc64 int `json:"crc64"`
	// ContentMd5与上传文件后返回的Content-MD5头内容一致,仅在调用PutObject和PostObject接口上传文件时,该变量的值不为空
	ContentMd5 string `json:"contentMd5"`
	// VpcId发起请求的客户端所在的VpcId,如果不是通过VPC发起请求,则该变量的值为空
	VpcId string `json:"vpcId"`
	// ClientIp发起请求的客户端IP地址
	ClientIp string `json:"clientIp"`
	// ReqId发起请求的RequestId
	ReqId string `json:"reqId"`
	// Operation发起请求的接口名称,例如PutObject、PostObject等
	Operation string `json:"operation"`
}

CallbackBody 结构体用于存储文件相关信息以及请求相关的一些元数据

type Config

type Config struct {
	// SignatureToken
	AccessKeyId     string `json:"access_key_id"`
	AccessKeySecret string `json:"access_key_secret"`
	Host            string `json:"host"`

	// Callback
	CallbackUrl      string `json:"callback_url"`
	CallbackBody     string `json:"callback_body"`
	CallbackBodyType string `json:"callback_body_type"`

	// Policy
	Directory    string `json:"directory"`
	ExpireSecond int64  `json:"expire_second"`
}

func (*Config) Validate added in v0.4.0

func (c *Config) Validate() error

type EscapeError

type EscapeError string

func (EscapeError) Error

func (e EscapeError) Error() string

type ImageInfo

type ImageInfo struct {
	// Height是图片高度,对于非图片格式,该变量的值为空
	Height int `json:"height"`
	// Width是图片宽度,对于非图片格式,该变量的值为空
	Width int `json:"width"`
	// Format是图片格式,例如JPG、PNG等,对于非图片格式,该变量的值为空
	Format string `json:"format"`
}

type InvalidHostError

type InvalidHostError string

func (InvalidHostError) Error

func (e InvalidHostError) Error() string

type Policy added in v0.1.0

type Policy struct {
	Expiration string `json:"expiration"` // required
	Conditions []any  `json:"conditions"` // optional
	// contains filtered or unexported fields
}

Policy https://help.aliyun.com/zh/oss/developer-reference/signature-version-1

func (*Policy) GetDirectory added in v0.1.0

func (c *Policy) GetDirectory() string

func (*Policy) GetExpire added in v0.1.0

func (c *Policy) GetExpire() int64

func (*Policy) SetBucket added in v0.1.0

func (c *Policy) SetBucket(bucket string)

func (*Policy) SetContentLengthRange added in v0.1.0

func (c *Policy) SetContentLengthRange(min int, max int)

func (*Policy) SetContentType added in v0.1.0

func (c *Policy) SetContentType(types ...string)

func (*Policy) SetDirectory added in v0.1.0

func (c *Policy) SetDirectory(uploadDir string)

func (*Policy) SetExpireTime added in v0.1.0

func (c *Policy) SetExpireTime(expiredAt time.Time)

type SignatureToken added in v0.2.0

type SignatureToken struct {
	// post object param
	OSSAccessKeyId string `json:"OSSAccessKeyId"` // required
	Policy         string `json:"policy"`         // required
	Callback       string `json:"callback"`       // optional
	Signature      string `json:"signature"`      // required
	// api param
	Host      string `json:"host"`      // optional
	Expire    int64  `json:"expire"`    // optional
	Directory string `json:"directory"` // optional

}

SignatureToken https://help.aliyun.com/zh/oss/developer-reference/postobject

type Token

type Token struct {
	// contains filtered or unexported fields
}

func NewToken

func NewToken(config *Config) *Token

func (*Token) Generate

func (t *Token) Generate() (*SignatureToken, error)

func (*Token) SetCallback added in v0.1.0

func (t *Token) SetCallback(callback *Callback) *Token

func (*Token) SetPolicy added in v0.1.0

func (t *Token) SetPolicy(policy *Policy) *Token

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL