对服务器进行身份验证¶
本主题介绍在使用 Snowflake SQL API 时如何对服务器进行身份验证。
发送请求时,请求必须包含身份验证信息。以下各部分说明如何将此信息添加到请求中:
使用 OAuth¶
若要使用 OAuth,请按照下列步骤操作:
设置 OAuth 进行身份验证。
有关如何设置 OAuth 和获取 OAuth 令牌的详细信息,请参阅 OAuth 简介。
使用 SnowSQL 验证可以使用生成的 OAuth 令牌连接到 Snowflake:
对于 Linux 和 MacOS 系统
对于 Windows 系统
在发送的每个 API 请求中,设置以下标头:
Authorization: Bearer oauth_token其中
oauth_token是生成的 OAuth 令牌。(可选):code:
X-Snowflake-Authorization-Token-Type: OAUTH如果您省略了
X-Snowflake-Authorization-Token-Type标头,Snowflake 将通过检查令牌来确定令牌类型。即使此标头可选,您也可以选择指定此标头。您可以将标头设置为以下值之一:
使用密钥对身份验证¶
若要使用密钥对身份验证,请按照下列步骤操作:
设置密钥对身份验证。
在此过程中,您必须执行以下操作:
生成公钥-私钥对。生成的私钥应位于文件中(例如,名为
rsa_key.p8)。将公钥分配给 Snowflake 用户。将密钥分配给用户后,运行 DESCRIBE USER 命令。在输出中,
RSA_PUBLIC_KEY_FP属性应设置为分配给用户的公钥的指纹。
有关如何生成密钥对并将密钥分配给用户的说明,请参阅 密钥对身份验证和密钥对轮换。有关创建指纹和生成 JWT 令牌的语言特定示例,请参阅以下内容:
使用 SnowSQL 验证可以使用生成的私钥 连接到 Snowflake:
该命令提示您输入私钥加密短语以完成连接。您可以通过在
PRIVATE_KEY_PASSPHRASE环境变量中提供密码来避免提示。在应用程序代码中,执行以下操作:
为用户生成公钥的指纹(SHA-256 哈希值)。在指纹前加上
SHA256:。例如:SHA256:hash还可以执行 SQL DESCRIBE USER 命令从 RSA_PUBLIC_KEY_FP 属性中获取值。
生成 一个 JSON Web 令牌 (JWT) (link removed),其有效负载中包含以下字段:
字段
描述
示例
issJWT 的发放者。将其设置为以下值:
account_identifier.user.SHA256:public_key_fingerprint其中:
account_identifier是 Snowflake 账户标识符。如果使用的是 账户定位器,请从账户定位器中排除任何区域信息。
user是 Snowflake 用户名。SHA256:public_key_fingerprint是在上一步中生成的指纹。
备注
account_identifier和user值必须全部使用大写字符。如果您的账户 ID 包含句点 (.),必须用连字符 (-) 将其替换,因为账户标识符中的句点会导致 JWT 无效。MYORGANIZATION-MYACCOUNT.MYUSER.SHA256:public_key_fingerprintsubJWT 的主题。将其设置为以下值:
account_identifier.userMYORGANIZATION-MYACCOUNT.MYUSERiatJWT 的发放时间(以 UTC 表示)。将该值设置为当前时间值,以秒或毫秒为单位。
expJWT 的过期时间(以 UTC 表示)。 可以将该值指定为秒或毫秒。
备注
即使指定了更长的过期时间,JWT 在令牌颁发后最多一个小时内有效。
在发送的每个 API 请求中,设置以下标头:
Authorization: Bearer JWT其中
JWT是生成的令牌。(可选):code:
X-Snowflake-Authorization-Token-Type: KEYPAIR_JWT如果您省略了
X-Snowflake-Authorization-Token-Type标头,Snowflake 将通过检查令牌来确定令牌类型。即使此标头可选,您也可以选择指定此标头。您可以将标头设置为以下值之一:
Python 示例¶
以下部分介绍如何使用 Python 生成 JWT 和指纹。
有关在 Python 中生成 JWT 的示例,请参阅 sql-api-generate-jwt.py。sql-api-generate-jwt.py 示例使用 ` PyJWT 模块 <https://pypi.org/project/PyJWT/ (https://pypi.org/project/PyJWT/)> `_,可以通过运行以下命令安装该模块:
在 Python 中生成 JWT¶
以下代码部分演示了如何生成 JWT。有关完整示例,请参阅 sql-api-generate-jwt.py。
备注
此示例仅供参考。请勿在生产应用程序或环境中使用此代码。
在 Python 中生成指纹¶
以下代码部分演示了如何生成指纹。有关完整示例,请参阅 sql-api-generate-jwt.py。
示例¶
You can use the Snowflake CLI snow connection generate-jwt command to generate a JWT for key-pair authentication. For more information, see snow connection generate-jwt.
此示例会使用来自 rsa_key.p8 的私钥为账户 TEST 和用户 JDOE 生成令牌:
该命令提示您输入私钥加密短语以完成连接。您可以通过在 PRIVATE_KEY_PASSPHRASE 环境变量中提供密码来避免提示。
Java 示例¶
有关在 Java 中生成 JWT 的示例,请参阅 SimpleStatementsApi.java。
备注
此示例仅供参考。请勿在生产应用程序或环境中使用此代码。
此示例使用以下第三方库:
` Swagger Codegen <https://swagger.io/tools/swagger-codegen/download/ (https://swagger.io/tools/swagger-codegen/download/)>`_ :一个开源库,可用于开发 REST APIs 和应用程序。
` Auth0 <https://auth0.com/docs/libraries (https://auth0.com/docs/libraries)>`_ :提供用于身份验证和生成 JWT 令牌的 Java APIs。
Node.js 示例¶
有关在 Node.js 中生成 JWT 的示例,请参阅 sql-api-generate-jwt.js。
备注
此示例仅供参考。请勿在生产应用程序或环境中使用此代码。