Office365-REST-Python-客户端访问令牌问题
Office365-REST-Python-Client Access Token issue
我发现了很多使用 Office365-REST-Python-Client 的例子,但是,none 其中 none 正确地获得了访问令牌。我已经在 Azure 门户下注册了一个应用程序,使用 'Application permissions' 授予它 API 权限,创建了一个秘密并使用了我的设置字典中的 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 许可证中。
亲切的问候
所以看起来当您没有获得访问令牌时可能会发生此错误。
我通过放弃我的 Azure 门户中的客户端和机密来修复此问题,而是在以下 URL:
下的 SharePoint 站点中生成它们
URL: https://[tenant].sharepoint.com/_layouts/15/appregnew.aspx
要了解您应该在 [tenant] 的 space 中使用什么,请查看您的 SharePoint URL 并选择 'https://' 和 '.[=48= 之间的文本]'。这是假设您的 SharePoint 由 Microsoft 托管。
单击生成按钮,使用相关的标题,除非您知道更好,否则只需为应用程序域输入 localhost 并重定向 URL。 (我的项目只是一个简单的上传脚本)。复制客户端 ID 和密钥。
如果您希望您的应用程序具有完全访问权限,请导航至:
https://[tenant]-admin.sharepoint.com/_layouts/15/appinv.aspx
还有一个link 'https://[tenant].sharepoint.com/_layouts/15/appinv.aspx' 但这不会让你申请完全控制权限。
将client id 粘贴到App id 中,使用相同的字段名称或一起link表单有什么乐趣?单击查找并使用下面的 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 有两个 'sites',因此默认情况下传递“https://[tenant].sharepoint.com”的基数 URL 会将我带到错误的站点,这意味着我正在查找的文档库不存在。要使用设置字典中的 Office365-REST-Python-Client 解决此问题,请确保 URL 设置具有您网站的填充路径,如下所示:
https://[tenant]-admin.sharepoint.com/sites/[site]
希望这对您有所帮助,这个信息让我浪费了太多时间!
我发现了很多使用 Office365-REST-Python-Client 的例子,但是,none 其中 none 正确地获得了访问令牌。我已经在 Azure 门户下注册了一个应用程序,使用 'Application permissions' 授予它 API 权限,创建了一个秘密并使用了我的设置字典中的 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 许可证中。
亲切的问候
所以看起来当您没有获得访问令牌时可能会发生此错误。
我通过放弃我的 Azure 门户中的客户端和机密来修复此问题,而是在以下 URL:
下的 SharePoint 站点中生成它们URL: https://[tenant].sharepoint.com/_layouts/15/appregnew.aspx
要了解您应该在 [tenant] 的 space 中使用什么,请查看您的 SharePoint URL 并选择 'https://' 和 '.[=48= 之间的文本]'。这是假设您的 SharePoint 由 Microsoft 托管。
单击生成按钮,使用相关的标题,除非您知道更好,否则只需为应用程序域输入 localhost 并重定向 URL。 (我的项目只是一个简单的上传脚本)。复制客户端 ID 和密钥。
如果您希望您的应用程序具有完全访问权限,请导航至:
https://[tenant]-admin.sharepoint.com/_layouts/15/appinv.aspx
还有一个link 'https://[tenant].sharepoint.com/_layouts/15/appinv.aspx' 但这不会让你申请完全控制权限。
将client id 粘贴到App id 中,使用相同的字段名称或一起link表单有什么乐趣?单击查找并使用下面的 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 有两个 'sites',因此默认情况下传递“https://[tenant].sharepoint.com”的基数 URL 会将我带到错误的站点,这意味着我正在查找的文档库不存在。要使用设置字典中的 Office365-REST-Python-Client 解决此问题,请确保 URL 设置具有您网站的填充路径,如下所示:
https://[tenant]-admin.sharepoint.com/sites/[site]
希望这对您有所帮助,这个信息让我浪费了太多时间!