Результат подписанного URL со случайным AuthenticationRequired - PullRequest
2 голосов
/ 15 января 2020

У меня есть 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
}

1 Ответ

1 голос
/ 16 января 2020

Решено :

Мой API использует заголовок Authorization для аутентификации пользователя и проверки, разрешено ли ему загружать файл. Но перенаправление HTTP сохраняет заголовки.

Если в CDN нет запрошенного файла в кеше, пользователь был перенаправлен в GCS и 401 отправляется для метода конфликта авторизации из-за запроса Signature param и заголовок Authorization:

Эта ошибка указывает на проблему с авторизацией, предоставленной в запросе к Cloud Storage. Ниже приведены некоторые ситуации, в которых это может произойти:

  • Было предоставлено несколько несоответствующих разрешений; выбрать только один режим

Это c помогает мне

Я просто меняю Authorization на другой, и это решает конфликт полномочий.

...