Přístup k souborům na SharePointu
Pokud pro vás zpracováváme data ze souborů uložených na SharePointu nebo OneDrive for Business, přistupujeme k nim pomocí Azure aplikace (service principal). Nepotřebujeme tedy žádný uživatelský účet ani heslo a přístup můžete kdykoliv jedním kliknutím odebrat.
Aplikace dostane pouze read-only oprávnění Microsoft Graphu:
Sites.Read.All– čtení obsahu SharePoint sites,Files.Read.All– čtení souborů.
Celé nastavení zvládne níže uvedený skript, který spustíte v Azure portálu.
Skript vytváří aplikaci a uděluje jí admin consent. Potřebujete tedy účet s rolí Global Administrator (případně kombinaci Application Administrator + Privileged Role Administrator). S nižšími právy skript aplikaci sice vytvoří, ale poslední krok (consent) selže – viz Když consent selže.
1. Otevřete Azure Cloud Shell
- Přihlaste se do portal.azure.com.
- V horní liště klikněte na ikonu Cloud Shell (
>_). - Zvolte Bash. (Při prvním spuštění po vás Azure může chtít vytvořit storage account – potvrďte, jde o pár korun měsíčně, případně zvolte variantu bez úložiště.)
2. Zkopírujte a spusťte skript
Celý následující blok zkopírujte najednou a vložte do Cloud Shellu. První část skript uloží do souboru, druhá ho spustí.
cat > setup-sharepoint-app.sh <<'SCRIPT'
#!/usr/bin/env bash
APP_NAME="app-sharepoint-etl"
GRAPH_APP_ID="00000003-0000-0000-c000-000000000000"
PERM_SITES_READ_ALL="332a536c-c7ef-4017-ab91-336970924f0d" # Sites.Read.All
PERM_FILES_READ_ALL="01d4889c-1287-42c6-ac1f-5d1e02578ef6" # Files.Read.All
APP_ID=""
SECRET=""
CONSENT_OK="NE"
echo "[1/6] Vytvářím app registration '$APP_NAME'..."
APP_ID=$(az ad app create \
--display-name "$APP_NAME" \
--sign-in-audience AzureADMyOrg \
--query appId -o tsv) || { echo "CHYBA: app se nepodařilo vytvořit"; exit 1; }
echo " Client ID: $APP_ID"
echo "[2/6] Vytvářím service principal..."
az ad sp create --id "$APP_ID" >/dev/null 2>&1 || echo " (SP už možná existuje, pokračuji)"
SP_OBJECT_ID=$(az ad sp show --id "$APP_ID" --query id -o tsv 2>/dev/null)
echo "[3/6] Generuji client secret..."
SECRET=$(az ad app credential reset \
--id "$APP_ID" \
--display-name "sharepoint-etl" \
--years 2 \
--query password -o tsv 2>/dev/null) || echo " CHYBA: secret se nepodařilo vytvořit"
echo "[4/6] Zapisuji požadovaná oprávnění do manifestu app..."
az ad app permission add \
--id "$APP_ID" \
--api "$GRAPH_APP_ID" \
--api-permissions "${PERM_SITES_READ_ALL}=Role" "${PERM_FILES_READ_ALL}=Role" \
>/dev/null 2>&1 || echo " CHYBA při zápisu oprávnění"
echo "[5/6] Zjišťuji object ID service principalu Microsoft Graph..."
GRAPH_SP_ID=$(az ad sp show --id "$GRAPH_APP_ID" --query id -o tsv 2>/dev/null)
echo "[6/6] Přiřazuji app role (= admin consent) přes Graph API..."
GRANTED=0
for ROLE_ID in "$PERM_SITES_READ_ALL" "$PERM_FILES_READ_ALL"; do
OK=0
for attempt in 1 2 3 4 5 6; do
if az rest --method POST \
--url "https://graph.microsoft.com/v1.0/servicePrincipals/${SP_OBJECT_ID}/appRoleAssignments" \
--headers "Content-Type=application/json" \
--body "{\"principalId\":\"${SP_OBJECT_ID}\",\"resourceId\":\"${GRAPH_SP_ID}\",\"appRoleId\":\"${ROLE_ID}\"}" \
>/dev/null 2>&1; then
OK=1; break
fi
echo " role ${ROLE_ID}: pokus ${attempt} neúspěšný, čekám 15 s..."
sleep 15
done
if [ "$OK" = "1" ]; then
echo " role ${ROLE_ID}: OK"
GRANTED=$((GRANTED+1))
else
echo " role ${ROLE_ID}: NEPODAŘILO SE"
fi
done
if [ "$GRANTED" = "2" ]; then CONSENT_OK="ANO"; fi
TENANT_ID=$(az account show --query tenantId -o tsv 2>/dev/null)
TENANT_DOMAIN=$(az rest --method GET \
--url "https://graph.microsoft.com/v1.0/domains" \
--query "value[?isDefault].id | [0]" -o tsv 2>/dev/null)
echo ""
echo "===== ÚDAJE K PŘEDÁNÍ (secret se už nikdy znovu nezobrazí) ====="
echo "App name: $APP_NAME"
echo "Tenant ID: ${TENANT_ID:-<nezjištěno>}"
echo "Tenant domain: ${TENANT_DOMAIN:-<nezjištěno>}"
echo "Client ID: ${APP_ID:-<nevytvořeno>}"
echo "Client secret: ${SECRET:-<nevytvořeno>}"
echo "Oprávnění: Graph / Sites.Read.All + Files.Read.All (Application)"
echo "Admin consent: $CONSENT_OK"
echo "Expirace: $(date -u -d '+2 years' +%Y-%m-%d 2>/dev/null)"
echo "==============================================================="
echo ""
SCRIPT
bash setup-sharepoint-app.sh
Skript musí běžet jako soubor (bash setup-sharepoint-app.sh), ne přes source a ne vkládáním po částech. Jinak se proměnné se secretem chovají nepředvídatelně a výsledný výpis nemusí být kompletní.
Doba běhu je typicky do půl minuty. Pokud se v kroku [6/6] objeví hlášky o neúspěšných pokusech, je to v pořádku – nově vytvořený service principal se v Entra ID chvíli propisuje a skript to sám několikrát zopakuje.
3. Zkopírujte a pošlete nám výstup
Na konci skript vypíše blok ÚDAJE K PŘEDÁNÍ. Ten celý zkopírujte a pošlete nám ho.
===== ÚDAJE K PŘEDÁNÍ (secret se už nikdy znovu nezobrazí) =====
App name: app-sharepoint-etl
Tenant ID: ...
Tenant domain: ...
Client ID: ...
Client secret: ...
Oprávnění: Graph / Sites.Read.All + Files.Read.All (Application)
Admin consent: ANO
Expirace: ...
===============================================================
Kromě toho nám prosím pošlete odkazy (URL) na konkrétní SharePoint sites, knihovny nebo soubory, ze kterých máme data číst.
Client secret se v Azure portálu už nikdy znovu nezobrazí a výpis obsahuje jeho plné znění. Pošlete nám ho bezpečným kanálem – viz Obecné bezpečnostní zásady, např. přes pwpush s platností 1 zobrazení / 1 den.
Když consent selže
Pokud je na výpisu Admin consent: NE, aplikace i secret existují, chybí jen potvrzení oprávnění. Doplní ho v portálu kdokoliv s dostatečnou rolí:
- Microsoft Entra ID → App registrations →
app-sharepoint-etl. - Vlevo API permissions. V seznamu už uvidíte
Sites.Read.AllaFiles.Read.Alltypu Application se žlutým upozorněním. - Klikněte na Grant admin consent for <název tenantu> a potvrďte.
- U obou oprávnění se objeví zelená fajfka – pak nám stačí poslat výpis ze skriptu (secret je platný bez ohledu na consent).
Časté dotazy
Jde omezit přístup jen na vybrané sites?
Ano. Místo Sites.Read.All lze použít Sites.Selected, kde se pak explicitně povolí jednotlivé SharePoint sites. Nastavení je o něco pracnější (každý site se povoluje zvlášť přes Graph API) – pokud to chcete takto, dejte nám vědět a připravíme upravený skript.
Co když už podobná aplikace existuje?
Skript se pokusí vytvořit novou app registration se jménem app-sharepoint-etl. Pokud stejné jméno už v tenantu je, vznikne druhá aplikace se stejným zobrazovaným jménem, ale jiným Client ID – nic se nerozbije, jen si pak v portálu ověřte, kterou nám posíláte.
Jak dlouho přístup platí? Client secret má platnost 2 roky (datum je na výpisu). Před vypršením se vám ozveme a vygenerujeme nový.
Jak přístup odeberu?
V Microsoft Entra ID → App registrations aplikaci app-sharepoint-etl smažete. Tím okamžitě zaniká veškerý náš přístup k souborům.