У меня есть CDN в gcloud, настроенный с бэкэндом хранилища, корзина является частной, и я даю разрешение ObjectViewer
учетной записи службы CDN (serviceAccount:service-XXXX@cloud-cdn-fill.iam.gserviceaccount.com
)
У меня есть API для запроса файлы из CDN:
- Этот API-интерфейс проверяет, разрешено ли пользователю загружать запрошенный файл
- Вычислить подписанный URL-адрес для этого файла, используя CDN URL
- Перенаправить пользователя с вычисленным подписанным URL-адресом
В большинстве случаев клиенту удается загрузить файл и получить 200
, но у меня возникают случайные ошибки, когда мой клиент (мобильное приложение) перенаправляется на подписанный URL:
<?xml version='1.0' encoding='UTF-8'?><Error><Code>AuthenticationRequired</Code><Message>Authentication required.</Message></Error>
Создание нового подписанного URL не устранило эту проблему: ошибка была отправлена в течение X минут / секунд.
Мой ответ API с 301
и didn ' вызвать ошибки авторизации. Эта ошибка была отправлена балансировщиком нагрузки 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
}