Няма достъп до blob за съхранение на azure чрез url, въпреки че е удостоверен

Имам приложение nodejs, използващо експресната рамка. Потребителят трябва да влезе чрез протокол Oauth2 срещу своите идентификационни данни за MS Azure Active Directory. Това се прави с помощта на npm пакета passport-azure-ad-oauth2

Успешно накарах приложението да работи, така че мога да качвам файлове в blob форма в контейнер за съхранение на Azure. Нивото на достъп до контейнера е зададено на частно. Зададох потребителски роли за контейнера, така че определени потребители в рамките на рекламата да имат „достъп за четене и данни“. Моето разбиране е, че когато тези потребители са удостоверени чрез Oauth2, те трябва да имат достъп до файловете, когато извличат URL адреса на файла. След удостоверяване обаче нямам достъп до файловете. Получавам следната грешка.

ResourceNotFound The specified resource does not exist. RequestId:6341ef80-f01e-0011-6442-08f7c2000000 Time:2021-02-21T11:14:26.3475641Z

Също така следвах стъпките за предоставяне на разрешения на приложението за хранилище в azure тук

Какво трябва да направя, за да могат удостоверените потребители да отидат до конкретния URL адрес за всеки петно ​​и да получат достъп? Трябва ли да предам токен в заявката? Ако е така, как правите това?

Всяка помощ ще бъде много ценена.


person b.b.89    schedule 21.02.2021    source източник


Отговори (1)


Грешката 404 (Посоченият ресурс не съществува) винаги е свързана с URL адреса на вашата заявка, но не и с маркера за достъп.

Например, за да получавате blob, трябва да използвате Методът GET и някои от заглавките на заявката са задължителни.

GET https://myaccount.blob.core.windows.net/mycontainer/myblob
headers:  
     Authorization: Bear <access-token>
     x-ms-version: 2020-04-08
     x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT

Вземете токен за достъп чрез разрешение за приложение без потребител:

POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

client_id={client_id}
&client_secret={client_secret}
&scope=http://storage.azure.com/.default  // change to http://storage.azure.com/ for resource
&grant_type=client_credentials

Вземете токен за достъп чрез делегирано разрешение с влязъл потребител:

GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={client_id}
&response_type=token
&redirect_uri=https://localhost:44300/
&scope=https://storage.azure.com/user_impersonation
&response_mode=fragment
&state=12345
&nonce=678910

Забележка: Отидете до вашия акаунт за съхранение -› Контрол на достъпа (IAM) -› Добавете присвояване на роля -› изберете Storage Blob Data XXX роля и вашия акаунт за влизане. Добавям Storage Blob Data Contributor към себе си, може да отнеме до 5 минути за разпространение на правилото RBAC.

въведете описание на изображението тук

person Pamela Peng    schedule 21.02.2021
comment
Благодаря ти. Извинения, тъй като все още се уча. На какъв етап получавам токена за достъп, веднага след влизане? Или искам токен за достъп всеки път, когато искам да изтегля файл чрез URL адреса? Как да структурирам приложението, така че токенът за достъп да е винаги наличен след влизане, така че всеки файл да може да бъде изтеглен, стига потребителят да се е удостоверил? - person b.b.89; 22.02.2021
comment
Актуализация - успях да получа токена за достъп с помощта на пощальон. Когато обаче се опитам да използвам GET заявката, за да получа желания ресурс, получавам 403: неупълномощен отговор - person b.b.89; 22.02.2021
comment
Можете да получите токен за достъп, след като влезете, вижте моя втори метод с помощта на имплицитен поток. Но маркерът за достъп ще изтече след един час, трябва да го получите отново. Относно грешка 403, моля, вижте Забележка в моя отговор и трябва да добавите разрешение за API за съхранение в приложението си. - person Pamela Peng; 22.02.2021
comment
Благодаря ви за помощта... така че успях да получа отговор 200 в пощальона, като репликирах вашия код „делегиран отговор с вписан потребител“ по-горе. Но просто се чудя къде е маркерът за достъп? Току-що получавам заглавки set-cookie buid, fpc= и т.н... благодаря отново за помощта - person b.b.89; 22.02.2021
comment
Токенът за достъп не се съхранява автоматично. Ако използвате MSAL.js, можете да го съхраните в кеша на токените, пример тук. - person Pamela Peng; 23.02.2021
comment
Здравей Памела, благодаря ти за помощта по този въпрос. Извинения за късния отговор, трябваше да отложа работата, но сега се върнах. Имам приложение за преден край на реакция, където потребителят влиза в приложението с помощта на @azure/msal-браузър. Това изглежда връща токен и се съхранява в кеша. Мога ли да използвам този токен (токен 1) за достъп до петното? Или трябва да получа различен токен за достъп (токен 2), като използвам, да речем, третия ви кодов фрагмент по-горе (вземете делегиран потребител с токен)? Ако е така, трябва ли токенът, получен след първоначалното влизане (токен 1), да бъде изпратен в заявката за придобиване на токен 2? Дано това има смисъл - person b.b.89; 05.04.2021