Přeskočit na hlavní obsah

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.

Kdo to musí spustit

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​

  1. Přihlaste se do portal.azure.com.
  2. V horní liště klikněte na ikonu Cloud Shell (>_).
  3. 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
Nespouštějte skript řádek po řádku

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 je heslo

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.


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í:

  1. Microsoft Entra ID → App registrations → app-sharepoint-etl.
  2. Vlevo API permissions. V seznamu už uvidíte Sites.Read.All a Files.Read.All typu Application se žlutým upozorněním.
  3. Klikněte na Grant admin consent for <název tenantu> a potvrďte.
  4. 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.