diff --git a/api/auth/center.go b/api/auth/center.go index 565f11f..0d968af 100644 --- a/api/auth/center.go +++ b/api/auth/center.go @@ -44,6 +44,8 @@ type ( prs int ) +var ErrNoAuthorizationHeader = errors.New("no authorization header") + func (p prs) Read(_ []byte) (n int, err error) { panic("implement me") } @@ -70,7 +72,7 @@ func (c *center) Authenticate(r *http.Request) (*token.BearerToken, error) { authHeaderField := r.Header["Authorization"] if len(authHeaderField) != 1 { - return nil, errors.New("unsupported request: wrong length of Authorization header field") + return nil, ErrNoAuthorizationHeader } sms1 := c.reg.getSubmatches(authHeaderField[0]) diff --git a/api/layer/layer.go b/api/layer/layer.go index e238b42..ee4ff48 100644 --- a/api/layer/layer.go +++ b/api/layer/layer.go @@ -130,18 +130,22 @@ func (n *layer) GetBucketInfo(ctx context.Context, name string) (*BucketInfo, er return nil, err } - list, err := n.containerList(ctx) - if err != nil { - return nil, err - } - - for _, bkt := range list { - if bkt.Name == name { - return bkt, nil + containerID := new(cid.ID) + if err := containerID.Parse(name); err != nil { + list, err := n.containerList(ctx) + if err != nil { + return nil, err } + for _, bkt := range list { + if bkt.Name == name { + return bkt, nil + } + } + + return nil, status.Error(codes.NotFound, "bucket not found") } - return nil, status.Error(codes.NotFound, "bucket not found") + return n.containerInfo(ctx, containerID) } // ListBuckets returns all user containers. Name of the bucket is a container diff --git a/api/user-auth.go b/api/user-auth.go index cb530e7..df150a4 100644 --- a/api/user-auth.go +++ b/api/user-auth.go @@ -19,15 +19,22 @@ var BearerTokenKey = KeyWrapper("__context_bearer_token_key") func AttachUserAuth(router *mux.Router, center auth.Center, log *zap.Logger) { router.Use(func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var ctx context.Context token, err := center.Authenticate(r) if err != nil { - log.Error("failed to pass authentication", zap.Error(err)) - WriteErrorResponse(r.Context(), w, GetAPIError(ErrAccessDenied), r.URL) - return + if err == auth.ErrNoAuthorizationHeader { + log.Debug("couldn't receive bearer token, using neofs-key") + ctx = r.Context() + } else { + log.Error("failed to pass authentication", zap.Error(err)) + WriteErrorResponse(r.Context(), w, GetAPIError(ErrAccessDenied), r.URL) + return + } + } else { + ctx = context.WithValue(r.Context(), BearerTokenKey, token) } - h.ServeHTTP(w, r.WithContext( - context.WithValue(r.Context(), BearerTokenKey, token))) + h.ServeHTTP(w, r.WithContext(ctx)) }) }) }