Modify: auth instance as first param in SignURI/Request

pull/247/head
HFO4 5 years ago
parent b5ee3ee609
commit de4793aacb

@ -15,11 +15,11 @@ func SignRequired() gin.HandlerFunc {
var err error var err error
switch c.Request.Method { switch c.Request.Method {
case "PUT", "POST": case "PUT", "POST":
err = auth.CheckRequest(c.Request) err = auth.CheckRequest(auth.General, c.Request)
// TODO 生产环境去掉下一行 // TODO 生产环境去掉下一行
err = nil //err = nil
default: default:
err = auth.CheckURI(c.Request.URL) err = auth.CheckURI(auth.General, c.Request.URL)
} }
if err != nil { if err != nil {

@ -31,9 +31,9 @@ type Auth interface {
// SignRequest 对PUT\POST等复杂HTTP请求签名如果请求Header中 // SignRequest 对PUT\POST等复杂HTTP请求签名如果请求Header中
// 包含 X-Policy 则此请求会被认定为上传请求只会对URI部分和 // 包含 X-Policy 则此请求会被认定为上传请求只会对URI部分和
// Policy部分进行签名。其他请求则会对URI和Body部分进行签名。 // Policy部分进行签名。其他请求则会对URI和Body部分进行签名。
func SignRequest(r *http.Request, expires int64) *http.Request { func SignRequest(instance Auth, r *http.Request, expires int64) *http.Request {
// 生成签名 // 生成签名
sign := General.Sign(getSignContent(r), expires) sign := instance.Sign(getSignContent(r), expires)
// 将签名加到请求Header中 // 将签名加到请求Header中
r.Header["Authorization"] = []string{"Bearer " + sign} r.Header["Authorization"] = []string{"Bearer " + sign}
@ -41,7 +41,7 @@ func SignRequest(r *http.Request, expires int64) *http.Request {
} }
// CheckRequest 对复杂请求进行签名验证 // CheckRequest 对复杂请求进行签名验证
func CheckRequest(r *http.Request) error { func CheckRequest(instance Auth, r *http.Request) error {
var ( var (
sign []string sign []string
ok bool ok bool
@ -51,7 +51,7 @@ func CheckRequest(r *http.Request) error {
} }
sign[0] = strings.TrimPrefix(sign[0], "Bearer ") sign[0] = strings.TrimPrefix(sign[0], "Bearer ")
return General.Check(getSignContent(r), sign[0]) return instance.Check(getSignContent(r), sign[0])
} }
// getSignContent 根据请求Header中是否包含X-Policy判断是否为上传请求 // getSignContent 根据请求Header中是否包含X-Policy判断是否为上传请求
@ -69,14 +69,14 @@ func getSignContent(r *http.Request) (rawSignString string) {
} }
// SignURI 对URI进行签名,签名只针对Path部分query部分不做验证 // SignURI 对URI进行签名,签名只针对Path部分query部分不做验证
func SignURI(uri string, expires int64) (*url.URL, error) { func SignURI(instance Auth, uri string, expires int64) (*url.URL, error) {
base, err := url.Parse(uri) base, err := url.Parse(uri)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 生成签名 // 生成签名
sign := General.Sign(base.Path, expires) sign := instance.Sign(base.Path, expires)
// 将签名加到URI中 // 将签名加到URI中
queries := base.Query() queries := base.Query()
@ -87,14 +87,14 @@ func SignURI(uri string, expires int64) (*url.URL, error) {
} }
// CheckURI 对URI进行鉴权 // CheckURI 对URI进行鉴权
func CheckURI(url *url.URL) error { func CheckURI(instance Auth, url *url.URL) error {
//获取待验证的签名正文 //获取待验证的签名正文
queries := url.Query() queries := url.Query()
sign := queries.Get("sign") sign := queries.Get("sign")
queries.Del("sign") queries.Del("sign")
url.RawQuery = queries.Encode() url.RawQuery = queries.Encode()
return General.Check(url.Path, sign) return instance.Check(url.Path, sign)
} }
// Init 初始化通用鉴权器 // Init 初始化通用鉴权器

@ -16,7 +16,7 @@ func TestSignURI(t *testing.T) {
// 成功 // 成功
{ {
sign, err := SignURI("/api/v3/something?id=1", 0) sign, err := SignURI(General, "/api/v3/something?id=1", 0)
asserts.NoError(err) asserts.NoError(err)
queries := sign.Query() queries := sign.Query()
asserts.Equal("1", queries.Get("id")) asserts.Equal("1", queries.Get("id"))
@ -25,7 +25,7 @@ func TestSignURI(t *testing.T) {
// URI解码失败 // URI解码失败
{ {
sign, err := SignURI("://dg.;'f]gh./'", 0) sign, err := SignURI(General, "://dg.;'f]gh./'", 0)
asserts.Error(err) asserts.Error(err)
asserts.Nil(sign) asserts.Nil(sign)
} }
@ -37,16 +37,16 @@ func TestCheckURI(t *testing.T) {
// 成功 // 成功
{ {
sign, err := SignURI("/api/ok?if=sdf&fd=go", time.Now().Unix()+10) sign, err := SignURI(General, "/api/ok?if=sdf&fd=go", time.Now().Unix()+10)
asserts.NoError(err) asserts.NoError(err)
asserts.NoError(CheckURI(sign)) asserts.NoError(CheckURI(General, sign))
} }
// 过期 // 过期
{ {
sign, err := SignURI("/api/ok?if=sdf&fd=go", time.Now().Unix()-1) sign, err := SignURI(General, "/api/ok?if=sdf&fd=go", time.Now().Unix()-1)
asserts.NoError(err) asserts.NoError(err)
asserts.Error(CheckURI(sign)) asserts.Error(CheckURI(General, sign))
} }
} }
@ -58,7 +58,7 @@ func TestSignRequest(t *testing.T) {
{ {
req, err := http.NewRequest("POST", "http://127.0.0.1/api/v3/slave/upload", strings.NewReader("I am body.")) req, err := http.NewRequest("POST", "http://127.0.0.1/api/v3/slave/upload", strings.NewReader("I am body."))
asserts.NoError(err) asserts.NoError(err)
req = SignRequest(req, 0) req = SignRequest(General, req, 0)
asserts.NotEmpty(req.Header["Authorization"]) asserts.NotEmpty(req.Header["Authorization"])
} }
@ -71,7 +71,7 @@ func TestSignRequest(t *testing.T) {
) )
asserts.NoError(err) asserts.NoError(err)
req.Header["X-Policy"] = []string{"I am Policy"} req.Header["X-Policy"] = []string{"I am Policy"}
req = SignRequest(req, 10) req = SignRequest(General, req, 10)
asserts.NotEmpty(req.Header["Authorization"]) asserts.NotEmpty(req.Header["Authorization"])
} }
} }
@ -88,8 +88,8 @@ func TestCheckRequest(t *testing.T) {
strings.NewReader("I am body."), strings.NewReader("I am body."),
) )
asserts.NoError(err) asserts.NoError(err)
req = SignRequest(req, 0) req = SignRequest(General, req, 0)
err = CheckRequest(req) err = CheckRequest(General, req)
asserts.NoError(err) asserts.NoError(err)
} }
@ -102,8 +102,8 @@ func TestCheckRequest(t *testing.T) {
) )
asserts.NoError(err) asserts.NoError(err)
req.Header["X-Policy"] = []string{"I am Policy"} req.Header["X-Policy"] = []string{"I am Policy"}
req = SignRequest(req, 0) req = SignRequest(General, req, 0)
err = CheckRequest(req) err = CheckRequest(General, req)
asserts.NoError(err) asserts.NoError(err)
} }
@ -115,9 +115,9 @@ func TestCheckRequest(t *testing.T) {
strings.NewReader("I am body."), strings.NewReader("I am body."),
) )
asserts.NoError(err) asserts.NoError(err)
req = SignRequest(req, 0) req = SignRequest(General, req, 0)
req.Body = ioutil.NopCloser(strings.NewReader("2333")) req.Body = ioutil.NopCloser(strings.NewReader("2333"))
err = CheckRequest(req) err = CheckRequest(General, req)
asserts.Error(err) asserts.Error(err)
} }
} }

@ -41,7 +41,7 @@ var CORSConfig = &cors{
AllowOrigins: []string{"UNSET"}, AllowOrigins: []string{"UNSET"},
AllowMethods: []string{"PUT", "POST", "GET", "OPTIONS"}, AllowMethods: []string{"PUT", "POST", "GET", "OPTIONS"},
AllowHeaders: []string{"Cookie", "Content-Length", "Content-Type", "X-Path", "X-FileName"}, AllowHeaders: []string{"Cookie", "Content-Length", "Content-Type", "X-Path", "X-FileName"},
AllowCredentials: true, AllowCredentials: false,
ExposeHeaders: nil, ExposeHeaders: nil,
} }

@ -142,12 +142,14 @@ func (handler Handler) Source(
// 签名生成文件记录 // 签名生成文件记录
signedURI, err = auth.SignURI( signedURI, err = auth.SignURI(
auth.General,
fmt.Sprintf("/api/v3/file/download/%s", downloadSessionID), fmt.Sprintf("/api/v3/file/download/%s", downloadSessionID),
expires, expires,
) )
} else { } else {
// 签名生成文件记录 // 签名生成文件记录
signedURI, err = auth.SignURI( signedURI, err = auth.SignURI(
auth.General,
fmt.Sprintf("/api/v3/file/get/%d/%s", file.ID, file.Name), fmt.Sprintf("/api/v3/file/get/%d/%s", file.ID, file.Name),
expires, expires,
) )

@ -79,7 +79,8 @@ func (handler Handler) Token(ctx context.Context, TTL int64, key string) (serial
uploadRequest.Header = map[string][]string{ uploadRequest.Header = map[string][]string{
"X-Policy": {policyEncoded}, "X-Policy": {policyEncoded},
} }
auth.SignRequest(uploadRequest, time.Now().Unix()+TTL) remoteAuth := auth.HMACAuth{SecretKey: []byte(handler.Policy.SecretKey)}
auth.SignRequest(remoteAuth, uploadRequest, time.Now().Unix()+TTL)
if credential, ok := uploadRequest.Header["Authorization"]; ok && len(credential) == 1 { if credential, ok := uploadRequest.Header["Authorization"]; ok && len(credential) == 1 {
return serializer.UploadCredential{ return serializer.UploadCredential{

@ -66,6 +66,7 @@ func (service *ItemService) Archive(ctx context.Context, c *gin.Context) seriali
ttl = 30 ttl = 30
} }
signedURI, err := auth.SignURI( signedURI, err := auth.SignURI(
auth.General,
fmt.Sprintf("/api/v3/file/archive/%s/archive.zip", zipID), fmt.Sprintf("/api/v3/file/archive/%s/archive.zip", zipID),
time.Now().Unix()+int64(ttl), time.Now().Unix()+int64(ttl),
) )

Loading…
Cancel
Save