为了账号安全,请及时绑定邮箱和手机立即绑定

带有随机 AuthenticationRequired 的签名 URL 结果

带有随机 AuthenticationRequired 的签名 URL 结果

Go
翻阅古今 2022-05-05 17:33:57
我在 gcloud 中有一个配置了存储桶后端的 CDN,该存储桶是私有的,我将ObjectViewer权限授予 CDN 服务帐户 ( 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 分钟/秒内发送的。我的 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}
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

已解决

我的 API 需要一个Authorization标头来验证用户并检查他是否被允许下载文件。但是 HTTP 重定向会保留标头。

如果 CDN 在缓存中没有请求的文件,则用户被重定向到 GCS,并且由于Signature查询参数和Authorization标头而为授权冲突方法发送 401:

此错误表示对 Cloud Storage 的请求中提供的授权存在问题。以下是会发生这种情况的一些情况:

  • 提供了多个不匹配的授权;只选择一种模式

该文档对我有帮助

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


查看完整回答
反对 回复 2022-05-05
?
GCT1015

TA贡献1827条经验 获得超4个赞

就我而言,我在前端网络服务器中有基本身份验证。当我的实际站点访问存储桶中的文件时,这些文件也通过负载均衡器作为另一个后端进行路由,该标头会导致问题。



查看完整回答
反对 回复 2022-05-05
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号