我发现了许多使用 Office365-REST-Python-Client 的示例,但是,它们都没有正确获取访问 token 。我已在 Azure 门户下注册了一个应用程序,使用“应用程序权限”授予其 API 权限,创建了一个 key ,并在我的设置字典中使用了 client_secret 和 client_id 以在下面的代码中使用。
def read_folder_and_files(context, list_title):
"""Read a folder example"""
list_obj = context.web.lists.get_by_title(list_title)
folder = list_obj.root_folder
context.load(folder)
context.execute_query()
print("List url: {0}".format(folder.properties["ServerRelativeUrl"]))
files = folder.files
context.load(files)
context.execute_query()
for cur_file in files:
print("File name: {0}".format(cur_file.properties["Name"]))
folders = context.web.folders
context.load(folders)
context.execute_query()
for folder in folders:
print("Folder name: {0}".format(folder.properties["Name"]))
if __name__ == '__main__':
ctx_auth = AuthenticationContext(url=settings['url'])
if ctx_auth.acquire_token_for_app(client_id=settings['client_credentials']['client_id'],
client_secret=settings['client_credentials']['client_secret']):
ctx = ClientContext(settings['url'], ctx_auth)
read_folder_and_files(ctx, "Documents")
# read_folder_and_files_alt(ctx, "Documents")
# upload_file_into_library(target_library, name, content)
# download_file(ctx)
else:
print(ctx_auth.get_last_error())
当我运行上面的代码时,出现以下错误:
File "/usr/local/lib/python3.7/site-packages/office365/runtime/auth/acs_token_provider.py", line 76, in get_authorization_header
return 'Bearer {0}'.format(self.access_token["access_token"])
KeyError: 'access_token'
我的最终目标是使用来自 python 数据管道的元数据将文件上传到 Sharepoint 文档库。 Sharepoint 不在本地托管,但包含在我们的 365 许可证中。
亲切的问候
最佳答案
所以看起来当您没有获得访问 token 时可能会发生此错误。
我通过在 Azure 门户中放弃客户端和 key ,而是在 SharePoint 站点中通过以下 URL 生成它们来解决此问题:
网址:https://[tenant].sharepoint.com/_layouts/15/appregnew.aspx
要了解您应该在 [租户] 空间中使用什么内容,请查看您的 SharePoint URL,并选择“https://”和“.sharepoint.com”之间的文本。这是假设您的 SharePoint 由 Microsoft 托管。
单击生成按钮,使用相关标题,除非您更了解,否则只需输入 localhost 作为应用程序域和重定向 URL。 (我的项目只是一个简单的上传脚本)。获取客户端 ID 和 secret 的副本。
如果您希望您的应用程序具有完全访问权限,请导航至:
https://[tenant]-admin.sharepoint.com/_layouts/15/appinv.aspx
还有另一个链接'https://[tenant].sharepoint.com/_layouts/15/appinv.aspx ' 但这不会让您申请完全控制权限。
将客户端 id 粘贴到应用程序 id 中,使用相同的字段名称或将表单链接在一起会有什么乐趣?单击“查找”并使用下面的 XML 授予完全控制权。
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection" Right="FullControl" />
</AppPermissionRequests>
单击“创建”,然后在下一页上单击“信任”。您需要以具有完全管理员权限的网站所有者身份登录才能授予此控制权。
我在这里找到了所有这些信息,如果您需要的话,可以更详细地了解: https://www.anupams.net/app-only-policy-with-tenant-level-permissions-in-sharepoint-online/
奖金信息: 我们的 Sharepoint 有两个“站点”,因此传递基本 URL“https://[tenant].sharepoint.com” ' 默认情况下将我带到了错误的站点,这意味着我正在查找的文档库不存在。要使用设置字典中的 Office365-REST-Python-Client 修复此问题,请确保 URL 设置具有指向您网站的填充路径,如下所示:
https://[tenant]-admin.sharepoint.com/sites/[site]
希望这有帮助,这些信息花费了我很多时间!
关于python - Office365-REST-Python-客户端访问 token 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57236329/