带有随机 AuthenticationRequired 的签名 URL 结果
Signed URL result with random AuthenticationRequired
我在 gcloud 中有一个配置了存储桶后端的 CDN,该桶是私有的,我向 CDN 服务帐户授予 ObjectViewer
权限 (serviceAccount:service-XXXX@cloud-cdn-fill.iam.gserviceaccount.com
)
我有一个 API 从 CDN 请求文件:
- 此 API 检查是否允许用户下载请求的文件
- 使用 CDN URL
为此文件计算签名 URL
- 使用计算出的符号重定向用户 url
大多数时候,客户端成功下载文件并收到 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
我只是把我的 Authorization
换成了另一个,它解决了授权冲突。
就我而言,我在前端网络服务器中使用了 Basic Auth。
当我的实际站点访问存储桶中的文件时,该存储桶也通过负载均衡器作为另一个后端进行路由,header 导致了问题。
我在 gcloud 中有一个配置了存储桶后端的 CDN,该桶是私有的,我向 CDN 服务帐户授予 ObjectViewer
权限 (serviceAccount:service-XXXX@cloud-cdn-fill.iam.gserviceaccount.com
)
我有一个 API 从 CDN 请求文件:
- 此 API 检查是否允许用户下载请求的文件
- 使用 CDN URL 为此文件计算签名 URL
- 使用计算出的符号重定向用户 url
大多数时候,客户端成功下载文件并收到 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
我只是把我的 Authorization
换成了另一个,它解决了授权冲突。
就我而言,我在前端网络服务器中使用了 Basic Auth。 当我的实际站点访问存储桶中的文件时,该存储桶也通过负载均衡器作为另一个后端进行路由,header 导致了问题。