C # + подписанный URL-адрес хранилища Google: рассчитанная нами подпись запроса не соответствует предоставленной вами подписи - PullRequest
0 голосов
/ 27 января 2019

Я только что создал этот блок: mybucket231.

Запуск этого кода C # для генерации URL-адреса со знаком:

using (var stream = new FileStream(@"path/to/secret.json", FileMode.Open, FileAccess.Read))
{
    var cred = GoogleCredential.FromStream(stream)
                               .CreateScoped("https://www.googleapis.com/auth/devstorage.full_control")
                               .UnderlyingCredential as ServiceAccountCredential;

    var urlSigner = UrlSigner.FromServiceAccountCredential(cred);
    var publicLink = urlSigner.Sign("mybucket231", "file.test", TimeSpan.FromHours(1));
}

Этот код генерирует URL-адрес со знаком с разрешением full_control.Возвращение URL выглядит следующим образом:

https://storage.googleapis.com/mybucket231/file.test?GoogleAccessId=new-storage-service-account@dotnet-core-cluster.iam.gserviceaccount.com&Expires=1548606014&Signature=HbL0ETXucaldz8jpoUDXUzYQu2YyhiMUh4Nfm69Y0sLyG3pvqbVvMMK1N8agywE8gW8s7kkInJCJuVGH%2FAHzd4LfeYo62iFK....FjnImQZq7fftv4TF5SpCPsVFnOGkSD6vOIpKqfJiswqGIERC9D7EJ%2B2DZ9JVMP7cEYjmAB9miemtD2eTVXu3FpBNbnDoxp112eTmu2F4TAckS0toX%2FmYk8GhOc9UnWH1iZ5VJ%2FKslFmRU0NFu4nxkDv7rk%2FRCvsOvvqrOqJT6cezE%2Bz%2FMONh%2FK5KfPs0ZnYslQwYNojhVR4sn5L8tVNst6gclFnA%3D%3D

Теперь я иду в Fiddler и пытаюсь создать файл с этой командой:

PUT https://storage.googleapis.com/mybucket231/file.test?GoogleAccessId=new-storage-service-account@secret.iam.gserviceaccount.com&Expires=1548606014&Signature=HbL0ETXucaldz8jpoUDXUzYQu2YyhiMUh4Nfm69Y0sLyG3pvqbVvMMK1N8agywE8gW8s7kkInJCJuVGH%2FAHzd4LfeYo62iFK....FjnImQZq7fftv4TF5SpCPsVFnOGkSD6vOIpKqfJiswqGIERC9D7EJ%2B2DZ9JVMP7cEYjmAB9miemtD2eTVXu3FpBNbnDoxp112eTmu2F4TAckS0toX%2FmYk8GhOc9UnWH1iZ5VJ%2FKslFmRU0NFu4nxkDv7rk%2FRCvsOvvqrOqJT6cezE%2Bz%2FMONh%2FK5KfPs0ZnYslQwYNojhVR4sn5L8tVNst6gclFnA%3D%3D

Headers:
User-Agent: Fiddler
Host: storage.googleapis.com
Content-Length: 3
content-type: text/plain

Body:
Hello world!

Это сообщение PUT возвращает ошибку403 (запрещено) с этим сообщением:

<?xml version='1.0' encoding='UTF-8'?>
<Error>
    <Code>SignatureDoesNotMatch</Code>
    <Message>The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method.</Message><StringToSign>PUT

plain/text
1548606014
/mybucket231/file.test</StringToSign>
</Error>

В нем говорится: SignatureDoesNotMatch .Но это странно.Я создаю этот файл и пробую глагол GET - та же подпись работает !

Как?Как решить глагол PUT?

Примечание. Моя учетная запись службы (new-storage-service-account@secret.iam.gserviceaccount.com) - StorageAdmin.

1 Ответ

0 голосов
/ 28 января 2019

Нашел проблему.На самом деле, было две проблемы:

  1. Вы должны указать content-type заголовок.Поэтому добавьте
  2. Тогда у меня возникла другая проблема.Разрешение content-type в нижнем регистре - этого недостаточно!вместо него должно быть Content-Type.

Окончательный код:

string url = urlSigner.Sign(
            "mybucket231",
            "file.test",
            TimeSpan.FromHours(1),
            HttpMethod.Put,
            contentHeaders: new Dictionary<string, IEnumerable<string>> {
                    { "Content-Type", new[] { "text/plain" } }
                }
            );
...