登录
首页 >  Golang >  Go问答

生成需要身份验证的URL签名的随机结果

来源:stackoverflow

时间:2024-03-04 12:15:26 368浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《生成需要身份验证的URL签名的随机结果》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我在 gcloud 中有一个配置了存储桶后端的 cdn,该存储桶是私有的,并且我向 cdn 服务帐号授予 objectviewer 权限 (serviceaccount:[email protected])

我有一个 api 可以从 cdn 请求文件:

  • 此 api 检查是否允许用户下载所请求的文件
  • 使用 cdn 网址计算此文件的签名网址
  • 使用计算出的签名网址重定向用户

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

authenticationrequiredauthentication required.

生成新的签名 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
}

解决方案


已解决

我的 API 采用 Authorization 标头来对用户进行身份验证并检查是否允许他下载文件。但 HTTP 重定向会保留标头。

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

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

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

This doc helps me

我只是将我的 Authorization 更改为另一个,它解决了授权冲突。

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

好了,本文到此结束,带大家了解了《生成需要身份验证的URL签名的随机结果》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>