You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake Streamlit审批工具与Microsoft Graph集成架构及实现咨询

Snowflake Streamlit 集成 Microsoft Graph 构建内部治理工作流解决方案

项目概述

我正在基于Snowflake Streamlit开发内部治理工作流应用,替代传统手动邮件+电子表格的治理追踪方式。用户可在Streamlit中提交请求并上传PDF、Excel、演示文稿等支持文档,预期工作流如下:

  • 用户上传文档至Streamlit
  • 审批人收到Outlook通知
  • 审批完成后自动执行:生成唯一Decision ID、创建SharePoint文件夹、上传文档至该文件夹、将SharePoint URL存储回Snowflake

目标SharePoint文件夹结构:

Decisions/
    2026/
        DEC-2026-00124/
            DecisionMemo.pdf
            SupportingAnalysis.xlsx
            ApprovalRecord.pdf

以下是针对核心集成疑问的解答:


1. 如何从Snowflake Streamlit直接调用Microsoft Graph API?

要直接调用Microsoft Graph API,需完成以下步骤:

  • 配置Snowflake外部访问规则:在Snowflake中创建允许访问graph.microsoft.com和Azure AD令牌端点login.microsoftonline.com的外部访问集成,确保Streamlit应用所在仓库具备访问权限。
  • 通过客户端凭据流获取令牌:利用Azure AD服务身份,通过客户端凭据流获取Graph API访问令牌,这是Snowflake Streamlit服务端环境下唯一可行的认证方式。
  • 编写API调用代码:在Streamlit脚本中用requests库发送带Bearer令牌的HTTPS请求。示例代码:
    import requests
    import snowflake.snowpark as snowpark
    
    def get_graph_access_token():
        # 从Snowflake Secrets读取Azure AD凭据
        secrets = snowpark.Session.current().secrets.get_secret("AZURE_AD_CREDENTIALS")
        token_endpoint = f"https://login.microsoftonline.com/{secrets['TENANT_ID']}/oauth2/v2.0/token"
        payload = {
            "grant_type": "client_credentials",
            "client_id": secrets["CLIENT_ID"],
            "client_secret": secrets["CLIENT_SECRET"],
            "scope": "https://graph.microsoft.com/.default"
        }
        response = requests.post(token_endpoint, data=payload)
        return response.json()["access_token"]
    
    def create_sp_folder(site_id, parent_folder_id, folder_name):
        token = get_graph_access_token()
        api_url = f"https://graph.microsoft.com/v1.0/sites/{site_id}/drive/items/{parent_folder_id}/children"
        headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}
        body = {"name": folder_name, "folder": {}}
        response = requests.post(api_url, json=body, headers=headers)
        return response.json()
    

2. Snowflake外部访问集成是否支持Microsoft Graph所需的OAuth令牌流?

Snowflake外部访问集成完全支持Microsoft Graph所需的客户端凭据流:

  • 可通过Snowflake Secrets Manager安全存储Azure AD的客户端ID、密钥和租户ID,杜绝硬编码风险。
  • 只需在外部访问规则中放行login.microsoftonline.com(令牌请求)和graph.microsoft.com(API调用)两个域名即可。
  • 注意:Snowflake Streamlit不支持交互式OAuth流(如授权码流),因为缺少用户浏览器交互上下文,客户端凭据流是唯一适配的服务端认证方案。

3. 直接调用Graph API vs 通过Azure Function/中间件路由:最佳实践?

推荐通过Azure Function作为中间层路由请求,原因如下:

  • 安全性:避免在Streamlit脚本中暴露Graph API逻辑和敏感凭据,中间层可额外添加权限校验、请求日志等安全控制。
  • 可扩展性:后续如需添加文档格式转换、审批状态同步等复杂逻辑,中间层更易扩展维护。
  • 稳定性:Snowflake对出站请求有速率限制(默认仓库每分钟100次请求),中间层可实现请求缓存、重试机制,提升可靠性。
  • 简化前端:Streamlit只需调用中间层API,无需处理Graph API的细节,降低代码复杂度。

若项目初期逻辑简单,可先直接调用Graph API,后续再逐步迁移到中间层架构。

4. 认证、密钥管理、出站请求、文件上传的限制

  • 认证:仅支持客户端凭据流,无法实现用户上下文的OAuth代理;若需以审批人身份发送邮件,需在Azure AD中为应用配置Mail.Send应用权限。
  • 密钥管理:必须使用Snowflake Secrets Manager存储敏感凭据,且需将Secrets绑定到Streamlit应用所在仓库,禁止硬编码。
  • 出站HTTPS请求:仅支持HTTPS协议,且受Snowflake仓库的速率限制约束,超出限制会触发请求阻塞。
  • Streamlit文件上传:单个文件大小默认限制为200MB,若需上传更大文件,需通过中间层先转存到Azure Blob Storage,再同步至SharePoint。

5. 实现Outlook内的审批/驳回工作流

可通过Microsoft Graph的审批请求功能实现:

  1. 在Azure AD应用中添加Approvals.ReadWrite.All应用权限。
  2. 用户提交请求时,调用Graph API创建审批请求,指定审批人、批准/驳回选项,并配置回调URL指向你的Azure Function。
  3. 审批人会收到Outlook原生审批通知,直接在邮件内点击按钮完成操作。
  4. Azure Function接收Graph API的回调,更新Snowflake中的审批状态,随后执行文件夹创建、文档上传等后续流程。

替代方案:若无需正式审批流程,可在Outlook通知邮件中添加自定义链接(指向Azure Function),链接携带审批状态参数,Function接收参数后处理后续逻辑。


内容的提问来源于stack exchange,提问作者siva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 02:52:33