带有随机 AuthenticationRequired 的签名 URL 结果

Signed URL result with random AuthenticationRequired

我在 gcloud 中有一个配置了存储桶后端的 CDN,该桶是私有的,我向 CDN 服务帐户授予 ObjectViewer 权限 (serviceAccount:service-XXXX@cloud-cdn-fill.iam.gserviceaccount.com)

我有一个 API 从 CDN 请求文件:

大多数时候,客户端成功下载文件并收到 200,但是当我的客户端(移动应用程序)被重定向到已签名的 URL 时,我随机出现错误:

<?xml version='1.0' encoding='UTF-8'?><Error><Code>AuthenticationRequired</Code><Message>Authentication required.</Message></Error>

生成新签名 URL 没有解决这个问题:错误是在 X minutes/seconds 期间发送的。

我的 API 回复 301 并且没有触发授权错误。此错误由 CND HTTP 负载平衡器发送,状态代码为 401.

这是我生成签名 URL 的函数:

func signURL(url string) (string, errors.Mwm) {
    expirationTime := time.Now().UTC().Add(internal.DefaultSignedURLValidTime).Unix()
    cdnKeyValue, err := internal.GetCDNSignKeyValue()
    if err != nil {
        return "", err
    }

    sep := "?"
    if strings.Contains(url, "?") {
        sep = "&"
    }
    url += sep
    url += fmt.Sprintf("Expires=%d", expirationTime)
    url += fmt.Sprintf("&KeyName=%s", internal.CdnSignKeyName)

    mac := hmac.New(sha1.New, cdnKeyValue)
    mac.Write([]byte(url))
    sig := base64.URLEncoding.EncodeToString(mac.Sum(nil))
    url += fmt.Sprintf("&Signature=%s", sig)
    return url, nil
}

已解决

我的 API 使用 Authorization header 来验证用户并检查他是否被允许下载文件。但是 HTTP 重定向保留 headers.

如果 CDN 在缓存中没有请求的文件,用户将被重定向到 GCS,并且由于 Signature 查询参数和 Authorization header :

This error indicates a problem with the authorization provided in the request to Cloud Storage. The following are some situations where that will occur :

  • Multiple non-matching authorizations were provided; choose one mode only

This doc helps me

我只是把我的 Authorization 换成了另一个,它解决了授权冲突。

就我而言,我在前端网络服务器中使用了 Basic Auth。 当我的实际站点访问存储桶中的文件时,该存储桶也通过负载均衡器作为另一个后端进行路由,header 导致了问题。