本頁說明如何使用組織身分識別提供者所發行的權杖向 Azure Databricks 進行驗證。
Azure Databricks 支援 OAuth 2.0 權杖交換 ,可讓您將同盟身分識別權杖交換為 Databricks OAuth 權杖。 透過權杖同盟,Databricks CLI、SDK 和其他工具可以自動處理此交換,並為您管理存取權杖。
每個存取權杖的存留期衍生自您提供的同盟權杖存留期,最常見的是一小時,但可能會有所不同。 這些工具會視需要自動重新整理權杖,因此您不需要手動要求或輪換認證。
驗證程序
若要使用來自同盟身分識別提供者的權杖驗證 Azure Databricks API 存取,請先設定必要的環境變數或設定欄位。 您慣用的工具或 SDK 會從您指定的位置擷取同盟 JSON Web 權杖 (JWT),將它交換為 Azure Databricks OAuth 權杖,並使用 OAuth 權杖來驗證 Azure Databricks REST API 呼叫。
先決條件
開始之前,請執行下列步驟:
- 為您的帳戶或服務主體建立同盟原則。
- 從身分識別提供者取得符合政策的有效 JWT。 權杖必須使用 RS256 或 ES256 進行簽署。 這些步驟因提供者而異,因此請參閱提供者的文件或詢問管理員。
設定您的環境
根據聯合權杖的來源來設定您的環境。 設定下列環境變數、 .databrickscfg 欄位、Terraform 欄位或 Config 欄位:
-
Databricks 主機:
https://accounts.azuredatabricks.net用於帳戶作業或目標 每個工作區 URL,例如https://adb-1234567890123456.7.azuredatabricks.net工作區作業。 - Databricks 帳戶識別碼: 只有在主機是帳戶主控台 URL 時才需要。
- 服務主體用戶端識別碼: 只有工作負載身分識別聯合才需要。 如果使用全帳戶權杖聯合原則進行驗證,則不得設定。
-
Databricks 驗證類型:
env-oidc如果權杖來自環境變數。file-oidc如果權杖來自檔案。 -
OIDC 權杖環境變數: 包含權杖的環境變數名稱。 只有在驗證方法為
env-oidc時才需要。 預設為DATABRICKS_OIDC_TOKEN。 -
OIDC 權杖檔案路徑: 包含聯合權杖之檔案的路徑。 只有在驗證方法為
file-oidc時才需要。
如需所有統一鑑別環境變數和配置欄位的完整參考,請參閱 統一鑑別的環境變數和欄位。
選擇您偏好的組態方法來設定驗證環境:
環境
設定下列環境變數:
export DATABRICKS_HOST=<workspace-url-or-account-console-url>
export DATABRICKS_ACCOUNT_ID=<account-id> # If DATABRICKS_HOST is the account console URL
export DATABRICKS_CLIENT_ID=<client-id> # Only for workload identity federation
export DATABRICKS_AUTH_TYPE=<auth-method> # env-oidc or file-oidc
export DATABRICKS_OIDC_TOKEN_ENV=<token-env-name> # If auth type is env-oidc
export DATABRICKS_OIDC_TOKEN_FILEPATH=<token-filepath-name> # If auth type is file-oidc
Profile
使用下列欄位建立或識別 .databrickscfg設定設定檔 :
[<profile-name>]
host = <workspace-url-or-account-console-url>
account_id = <account-id> # If host is the account console URL
client_id = <client-id> # Only for workload identity federation
auth_type = <auth-method> # env-oidc or file-oidc
oidc_token_env = <token-env-name> # If auth type is env-oidc
oidc_token_filepath = <token-filepath-name> # If auth type is file-oidc
CLI
針對 Databricks CLI,請執行下列其中一項:
- 設定環境變數,如「 環境」 標籤上所指定。
- 設定檔案中的
.databrickscfg值,如 設定檔 標籤上指定的值。
環境變數一律優先於 .databrickscfg 檔案中的值。
連線
針對 Databricks Connect,您可以:
-
使用組態配置檔:如 [
.databrickscfg] 索引標籤中所述,設定檔案中的工作區層級值。也請將 設定cluster_id為工作區實例 URL。 -
使用環境變數: 設定與 [ 環境] 索引標籤上所示相同的值。也請將 設定
DATABRICKS_CLUSTER_ID為工作區實例 URL。
的值 .databrickscfg 優先於環境變數。
若要使用這些設定初始化 Databricks Connect,請參閱 Databricks Connect 的計算組態。
VS Code
針對適用於 Visual Studio Code 的 Databricks 延伸項目,請執行下列動作:
- 設定檔案中的
.databrickscfgAzure Databricks 工作區層級作業 值,如 [設定檔] 索引標籤上所指定的。 - 在適用於 Visual Studio Code 的 Databricks 延伸項目的 [設定] 窗格中,按下 [設定 Databricks]。
- 在 [命令面板] 中,針對 [Databricks 主機],輸入您的工作區專用網址,例如
https://adb-1234567890123456.7.azuredatabricks.net,然後按Enter。 - 在 命令面板中,選取 URL 清單中目標設定檔的名稱。
如需詳細資訊,請參閱 為 Visual Studio Code 的 Databricks 擴充功能設定授權。
Terraform
對於帳戶層級作業
provider "databricks" {
alias = "accounts"
}
對於工作區層級作業:
provider "databricks" {
alias = "workspace"
}
Python
對於工作區層級作業:
from databricks.sdk import WorkspaceClient
# Uses environment configuration automatically
w = WorkspaceClient()
對於帳戶層級作業:
from databricks.sdk import AccountClient
# Uses environment configuration automatically
a = AccountClient()
JAVA
對於工作區層級作業:
import com.databricks.sdk.WorkspaceClient;
// Uses environment configuration automatically
WorkspaceClient w = new WorkspaceClient();
對於帳戶層級作業:
import com.databricks.sdk.AccountClient;
// Uses environment configuration automatically
AccountClient a = new AccountClient();
Go
對於工作區層級作業:
import "github.com/databricks/databricks-sdk-go"
// Uses environment configuration automatically
w := databricks.Must(databricks.NewWorkspaceClient())
對於帳戶層級作業:
import "github.com/databricks/databricks-sdk-go"
// Uses environment configuration automatically
a := databricks.Must(databricks.NewAccountClient())
如需使用 Go 和實作 Databricks 用戶端統一驗證的 Databricks 工具和 SDK 進行驗證的詳細資訊,請參閱使用 Azure Databricks 帳戶或工作區驗證適用於 Go 的 Databricks SDK。
存取 Databricks API
設定環境之後,您可以正常使用 Databricks CLI 和 SDK。 它們會自動處理權杖交換,並使用產生的 OAuth 權杖進行 API 驗證。
CLI
databricks clusters list
Python
from databricks.sdk import WorkspaceClient
w = WorkspaceClient() # Uses environment configuration
clusters = w.clusters.list()
JAVA
import com.databricks.sdk.WorkspaceClient;
WorkspaceClient w = new WorkspaceClient();
List<ClusterDetails> clusters = w.clusters().list();
Go
import "github.com/databricks/databricks-sdk-go"
w := databricks.Must(databricks.NewWorkspaceClient())
clusters := w.Clusters.ListAll(context.Background(), compute.List{})
實作自訂授權提供者
如果你的聯邦權杖來自非環境變數或檔案來源,你可以使用 Databricks SDK 撰寫自訂實作來取得聯邦權杖。
Python
from databricks.sdk import oidc
from databricks.sdk.core import (Config, CredentialsProvider, credentials_strategy, oidc_credentials_provider)
class MyCustomIdTokenSource(oidc.IdTokenSource):
def id_token(self) -> oidc.IdToken:
token = ... # Implement logic to return the ID token here
return oidc.IdToken(jwt=token)
@credentials_strategy("my-custom-oidc", "")
def my_custom_oidc_strategy(cfg: Config) -> CredentialsProvider:
return oidc_credentials_provider(cfg, MyCustomIdTokenSource())
if __name__ == "__main__":
cfg = Config(
host="https://my-workspace.cloud.databricks.com",
credentials_strategy=my_custom_oidc_strategy
)
from databricks.sdk import WorkspaceClient
w = WorkspaceClient(config=cfg)
# Use the client...
JAVA
import com.databricks.sdk.WorkspaceClient;
import com.databricks.sdk.core.DatabricksConfig;
import com.databricks.sdk.core.CredentialsProvider;
import com.databricks.sdk.core.oauth.IDTokenSource;
import com.databricks.sdk.core.oauth.IDToken;
public class CustomOIDCExample {
// Custom IDTokenSource that returns an OIDC ID token
static class MyCustomIdTokenSource implements IDTokenSource {
@Override
public IDToken getIDToken(String audience) {
// TODO: Implement logic to fetch or generate the ID token
String jwt = "..."; // your OIDC token here
return new IDToken(jwt);
}
}
public static void main(String[] args) {
// TODO: Wrap MyCustomIdTokenSource in a CredentialsProvider
// See the SDK documentation for the appropriate method
CredentialsProvider provider = ...; // Configure with MyCustomIdTokenSource
// Configure with workspace host and custom OIDC provider
DatabricksConfig cfg = new DatabricksConfig()
.setHost("https://my-workspace.cloud.databricks.com")
.setCredentialsProvider(provider);
// Initialize the workspace client
WorkspaceClient w = new WorkspaceClient(cfg);
System.out.println("Databricks client initialized: " + w);
// Use the client...
}
}
備註
此範例展示了如何實作自訂 IDTokenSource。 想了解如何用自訂權杖來源配置 a CredentialsProvider ,請參閱 Databricks 的 Java SDK 文件 ,或參考 GitHub 上的 SDK 原始碼。
Go
package main
import (
"context"
"fmt"
"github.com/databricks/databricks-sdk-go"
"github.com/databricks/databricks-sdk-go/config"
"github.com/databricks/databricks-sdk-go/credentials"
)
// MyCustomIdTokenSource implements a custom OIDC token source
type MyCustomIdTokenSource struct{}
func (s *MyCustomIdTokenSource) IDToken(ctx context.Context) (*credentials.IDToken, error) {
// TODO: Implement logic to return the ID token
token := "..."
return &credentials.IDToken{JWT: token}, nil
}
// myCustomOIDCStrategy is a custom credentials strategy
func myCustomOIDCStrategy(cfg *config.Config) (credentials.CredentialsProvider, error) {
return credentials.NewOIDCCredentialsProvider(cfg, &MyCustomIdTokenSource{}), nil
}
func main() {
cfg := &config.Config{
Host: "https://my-workspace.cloud.databricks.com",
}
// Register the custom credentials strategy
credentials.Register("my-custom-oidc", myCustomOIDCStrategy)
// Initialize the Databricks workspace client with custom auth
w, err := databricks.NewWorkspaceClientWithConfig(cfg)
if err != nil {
panic(err)
}
fmt.Println("Databricks client initialized:", w)
// Use the client...
}
手動交換權杖
如果你沒有使用 Databricks 的 SDK、CLI 或其他支援統一驗證的工具,你可以手動從身份提供者那裡交換 JWT,換取 Databricks OAuth 憑證。 若要這樣做,請使用 OAuth 2.0 權杖交換 (RFC 8693) 將要求傳送至 Azure Databricks 權杖端點。
首先,按照身分識別提供者的文件,從其取得聯合 JWT。 然後,將 JWT 交換為 Databricks OAuth 權杖,並使用該權杖來存取 Databricks REST API:
將同盟 JWT 交換為 Databricks OAuth 權杖
針對全帳戶同盟原則,此命令會將同盟 JWT 交換為 Databricks OAuth 權杖:
curl --request POST https://<databricks-workspace-host>/oidc/v1/token \
--data "subject_token=${FEDERATED_JWT_TOKEN}" \
--data 'subject_token_type=urn:ietf:params:oauth:token-type:jwt' \
--data 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data 'scope=all-apis'
小提示
若要存取 Databricks 帳戶資源,請使用 URL https://<databricks-account-host>/oidc/accounts/<account-id>/v1/token。
針對服務主體同盟原則,請在要求中包含用戶端識別碼:
curl --request POST https://<databricks-workspace-host>/oidc/v1/token \
--data "client_id=${CLIENT_ID}" \
--data "subject_token=${FEDERATED_JWT_TOKEN}" \
--data 'subject_token_type=urn:ietf:params:oauth:token-type:jwt' \
--data 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data 'scope=all-apis'
將 CLIENT_ID 取代為服務主體 UUID (例如,7cb2f8a4-49a7-4147-83db-35cb69e5cede)。
如果識別提供者的令牌有效且符合您的同盟原則,您會收到標準 JSON 回應,其中包含 [access_token] 字段中的 Databricks OAuth 令牌。 此 OAuth 令牌可用來存取 Databricks API。 產生的 Databricks OAuth 令牌的到期日 (exp) 宣告與 subject_token 參數中提供的 JWT 相同。
範例回應:
{
"access_token": "eyJraWQ...odi0WFNqQw",
"scope": "all-apis",
"token_type": "Bearer",
"expires_in": 3600
}
使用 OAuth 權杖來呼叫 Databricks API
然後,您可以使用產生的 Databricks OAuth 令牌做為持有人令牌來存取 Databricks API。 例如,若要呼叫 Databricks SCIM Me API 來擷取您的 Databricks 使用者和顯示名稱:
TOKEN='<your-databricks-oauth-token>'
curl --header "Authorization: Bearer $TOKEN" \
--url https://${DATABRICKS_WORKSPACE_HOSTNAME}/api/2.0/preview/scim/v2/Me
回應應該如下所示:
{
"userName": "username@mycompany.com",
"displayName": "Firstname Lastname"
}