Office365-REST-Python-客户端访问令牌问题

Ric*_*son 3 python sharepoint document-library sharepoint-online

我发现了许多使用 Office365-REST-Python-Client 的示例,但是,它们都没有正确获取访问令牌。我已在 Azure 门户下注册了一个应用程序,使用“应用程序权限”授予其 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())
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,出现以下错误:

  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'
Run Code Online (Sandbox Code Playgroud)

我的最终目标是使用来自 python 数据管道的元数据将文件上传到 Sharepoint 文档库。Sharepoint 不在本地托管,但包含在我们的 365 许可证中。

亲切的问候

Ric*_*son 5

因此,当您没有获得访问令牌时,可能会发生此错误。

我通过在 Azure 门户中放弃客户端和密钥,而是在 SharePoint 站点中通过以下 URL 生成它们来修复此问题:

网址:https://[租户].sharepoint.com/_layouts/15/appregnew.aspx

要了解您应该在 [租户] 空间中使用什么,请查看您的 SharePoint URL 并选择“https://”和“.sharepoint.com”之间的文本。这是假设您的 SharePoint 由 Microsoft 托管。

单击生成按钮,使用相关标题,除非您更了解,否则只需输入 localhost 作为应用程序域和重定向 URL。(我的项目只是一个简单的上传脚本)。获取客户端 ID 和密钥的副本。

如果您希望您的应用程序具有完全访问权限,请导航至:

https://[租户]-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>  
Run Code Online (Sandbox Code Playgroud)

单击“创建”,然后在下一页上单击“信任”。您需要以具有完全管理员权限的网站所有者身份登录才能授予此控制权。

我在这里找到了所有这些信息,如果您需要的话,可以更详细地了解: https: //www.anupams.net/app-only-policy-with-tenant-level-permissions-in-sharepoint-online/

额外信息:我们的 Sharepoint 有两个“站点”,因此传递“ https://[tenant].sharepoint.com ”的基本 URL默认情况下会将我带到错误的站点,这意味着我正在查找的文档库不存在。要使用设置字典中的 Office365-REST-Python-Client 修复此问题,请确保 URL 设置具有指向您网站的填充路径,如下所示:

https://[租户]-admin.sharepoint.com/sites/[站点]

希望这有帮助,这些信息花了我很多时间!