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

基于OAuth令牌交换协议向Snowflake请求令牌的配置与问题咨询

Azure AD应用令牌交换相关问题

我们在Azure AD上拥有一个应用注册,用户通过获取自身的Access Token完成认证,示例Token的Payload如下:

{
  "aud": "CLIENT_ID",
  "iss": "https://login.microsoftonline.com/TENANT_ID/v2.0",
  "iat": 1701270410,
  "nbf": 1701270410,
  "exp": 1701274744,
  "aio": "AUQAu/8VAAAAHAdHfHVno15JVZNMHln+AtJiQ5c9jjw5ny4AfK+0gq8siK+6H8bxHnE40bQMa5+oH/oTRxuuy2F/mYdD8w7RyQ==",
  "azp": "04b07795-8ddb-461a-bbee-02f9e1bf7b46",
  "azpacr": "0",
  "name": "USER_FULL_NAME",
  "oid": "USER_OBJECT_ID",
  "preferred_username": "USER_EMAIL_ADDRESS",
  "rh": "0.ARcA9s6n4x-uDUih6CznvYX1DqJqF4JIEcZBhyJIsPIi-CwXAO0.",
  "roles": [
    "READ"
  ],
  "scp": "read",
  "sub": "SVfA-IJg9t-Z73Le-dad5EAOyq3QjwU1oS5csbOTbGI",
  "tid": "TENANT_ID",
  "uti": "vOTt0phu40yVrNAqqj8oAA",
  "ver": "2.0"
}

该应用注册可通过此Token对用户进行认证与授权,执行相关代码逻辑。

现希望使用OAuth Token Exchange Protocol,让该应用注册借助用户的Access Token向Snowflake请求新的Access Token。标准请求示例如下:

POST /token
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&client_id=OUR_APP_REG_CLIENT_ID
&client_secret=OUR_APP_REG_CLIENT_SECRET
&scope=api2
&subject_token=USER_ACCESS_TOKEN
&subject_token_type=urn:ietf:params:oauth:token-type:access_token

问题1:Snowflake是否支持OAuth令牌交换协议?若支持,提供配置步骤及POST请求所需的其他参数

Snowflake支持基于OAuth 2.0的令牌交换,用于委派用户权限获取Snowflake访问令牌。以下是具体配置步骤和请求参数:

配置步骤

  1. 在Snowflake创建OAuth安全集成
    执行SQL语句创建集成,指定Azure AD作为身份提供商:
    CREATE SECURITY INTEGRATION AZURE_OAUTH_INTEGRATION
      TYPE = OAUTH
      OAUTH_CLIENT = AZURE
      OAUTH_CLIENT_ID = '<你的Azure应用客户端ID>'
      OAUTH_REDIRECT_URI = '<你的Azure应用重定向URI>'
      OAUTH_ISSUER = 'https://login.microsoftonline.com/<你的租户ID>/v2.0'
      ENABLED = TRUE;
    
  2. 分配Snowflake角色权限
    确保用户对应的Snowflake角色拥有必要的访问权限,例如:
    GRANT USAGE ON WAREHOUSE <仓库名称> TO ROLE <用户角色>;
    
  3. Azure AD应用权限配置
    在Azure AD应用注册的「API权限」中,添加Snowflake的委派权限(如有公开权限),确保应用具备访问Snowflake的权限。

POST请求完整参数

Snowflake的令牌端点为/oauth/token-request,需补充以下专属参数:

POST /oauth/token-request
Host: <你的Snowflake账户名>.snowflakecomputing.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
&client_id=<你的Azure应用客户端ID>
&client_secret=<你的Azure应用客户端密钥>
&scope=session:role:<Snowflake角色名>
&subject_token=<用户的Access Token>
&subject_token_type=urn:ietf:params:oauth:token-type:access_token
&resource=https://<你的Snowflake账户名>.snowflakecomputing.com
  • scope:指定要获取的Snowflake角色权限,格式为session:role:<角色名>
  • resource:Snowflake账户的完整URL,格式为https://<账户名>.snowflakecomputing.com

问题2:使用On Behalf Of模式请求时,令牌在jwt.io验证提示签名无效的解决方法

从以下维度排查并解决:

  1. 确认令牌类型正确
    确保assertion参数传入的是Azure AD签发的Access Token,而非ID Token。ID Token的aud为应用客户端ID,而Access Token的aud是目标资源ID(例如你请求的https://graph.microsoft.com)。

  2. 检查令牌受众(aud)匹配性
    OBO模式要求用户的Access Token必须颁发给你的应用(即aud为你的应用客户端ID),而非目标资源(如Graph API)。如果用户令牌的aud是目标资源ID,无法用于OBO交换。

  3. 验证应用权限配置

    • 在Azure AD应用注册的「API权限」中,添加目标资源(如Graph API)的委派权限,并确保管理员已同意该权限。
    • 机密客户端需确保客户端密钥有效,公共客户端需启用「允许公共客户端流」。
  4. 修正请求参数格式
    避免换行导致参数截断,修正后的curl命令如下:

    curl.exe -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&assertion={user_access_token}&scope=https://graph.microsoft.com/.default&requested_token_use=on_behalf_of" https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token
    

    确保scope和requested_token_use=on_behalf_of参数完整且正确。

  5. 验证令牌签名与有效性

    • 在jwt.io中选择正确的签名算法(Azure AD v2.0令牌通常使用RS256)。
    • 检查iss是否为https://login.microsoftonline.com/<租户ID>/v2.0,与你的租户ID匹配。
    • 确认令牌未过期(exp时间晚于当前时间)。
  6. 检查应用OBO权限配置
    在Azure AD应用注册的「清单」中,确保allowPublicClient根据应用类型设置正确(机密客户端设为false),并按需配置oauth2AllowIdTokenImplicitFlow或oauth2AllowImplicitFlow。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:04:58