{"id":477,"date":"2025-11-30T15:59:21","date_gmt":"2025-11-30T14:59:21","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=477"},"modified":"2025-11-30T15:59:22","modified_gmt":"2025-11-30T14:59:22","slug":"acceso-a-sharepoint-con-oauth-2-0","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=477","title":{"rendered":"Acceso a SharePoint con oAuth 2.0"},"content":{"rendered":"\n<p>oAuth 2.0 es un est\u00e1ndar de seguridad que permite acceder sin proporcionar un usuario y contrase\u00f1a. Para poder autorizarnos en SharePoint y poder posteriormente acceder a las unidades. Previamente nuestro administrador SharePoint deber\u00e1 registrar una App en Azure con permisos al recurso al que vamos a acceder y proporcionarnos el ID de la App registrada y la clave secreta o secret ID para poder autentificarnos. Con el tenant ID formaremos la URL donde nos autorizaremos:<\/p>\n\n\n\n<p>Usaremos requests para acceder y os para crear la carpeta si no existe y obtener la ruta de descarga. Si ya disponemos de todos los datos, podemos incluirlos en nuestro script de la siguiente forma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import os\nimport requests\n\nTENANT_ID = \"1234567890\"\nCLIENT_ID = \"1234567890\"\nCLIENT_SECRET = \"MiSecretodeSharePoint\"\n\nAUTH_URL = f\"https:\/\/login.microsoftonline.com\/{TENANT_ID}\/oauth2\/v2.0\/token\"\ndata = {\n\"client_id\": CLIENT_ID,\n\"scope\": \"https:\/\/graph.microsoft.com\/.default\",\n\"client_secret\": CLIENT_SECRET,\n\"grant_type\": \"client_credentials\",\n}\nresponse = requests.post(AUTH_URL, data=data)\nresponse.raise_for_status()\ntoken = response.json()[\"access_token\"]\n...\n<\/code><\/pre>\n\n\n\n<p>Si no ha habido ning\u00fan error, la variable token contiene el token de acceso que podremos usar posteriormente para lista o descargar archivos dependiendo de los permisos que tengamos.<\/p>\n\n\n\n<p>Para poder hacerlo deberemos primero disponer del ID del drive donde est\u00e1n las carpetas o archivos. Si ya disponemos del drive ID veamos como listar los archivos del drive.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">...\ntoken = response.json()[\"access_token\"]\nGRAPH_BASE_URL = \"https:\/\/graph.microsoft.com\/v1.0\"\nDRIVE_ID = \"Drive_ID_Mi_Disco\"\n\nurl = f\"{GRAPH_BASE_URL}\/drives\/{DRIVE_ID}\/root\/children\"\nheaders = {\"Authorization\": f\"Bearer {token}\"}\nresponse = requests.get(url, headers=headers)\nresponse.raise_for_status()\nitems = response.json()[\"value\"]\n\nfor item in items:\n    tipo = \"Carpeta\" if \"folder\" in item else \"Archivo\"\n    print(f\"- {item['name']} ({tipo}) | ID: {item['id']} | {item['createdDateTime']}\")<\/code><\/pre>\n\n\n\n<p>Para descargar archivos hacemos esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">...\nRUTA_DESCARGA = \".\/descargas\"\n    \nurl = f\"{GRAPH_BASE_URL}\/drives\/{drive_id}\/items\/{item_id}\/content\"\nheaders = {\"Authorization\": f\"Bearer {token}\"}\nresponse = requests.get(url, headers=headers, stream=True)\nresponse.raise_for_status()\n\nos.makedirs(RUTA_DESCARGA, exist_ok=True)\nfilepath = os.path.join(RUTA_DESCARGA, filename)\n\nwith open(filepath, \"wb\") as f:\n    for chunk in response.iter_content(chunk_size=8192):\n        f.write(chunk)\nprint(f\"Archivo descargado: {filepath}\")<\/code><\/pre>\n\n\n\n<p>Espero que os sea de utilidad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>oAuth 2.0 es un est\u00e1ndar de seguridad que permite acceder sin proporcionar un usuario y contrase\u00f1a. Para poder autorizarnos en &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[136,4],"tags":[104,6,161,138],"class_list":["post-477","post","type-post","status-publish","format-standard","hentry","category-microsoft","category-python","tag-os","tag-python3","tag-requests","tag-sharepoint"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/477","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=477"}],"version-history":[{"count":1,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions"}],"predecessor-version":[{"id":478,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/477\/revisions\/478"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=477"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=477"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=477"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}