The documentation you are viewing is for Dapr v1.5 which is an older version of Dapr. For up-to-date documentation, see the latest version.

在 Dapr 上启用 token 认证

要求 Dapr 的每个传入 API 请求都包含身份验证令牌,然后才能放行

默认情况下,Dapr 依靠网络边界来限制对其公共 API 的访问。 如果你打算将 Dapr API 暴露在网络边界之外,或者如果您的 deployment 需要额外级别的安全性,那么请考虑开启 Dapr API 的令牌认证。 这将使得 Dapr 要求每个入站 gRPC 和 HTTP API 请求都需要包含认证令牌,然后请求才能放行。

创建令牌

Dapr 使用 JWT token进行 API 身份验证。

请注意,虽然 Dapr 本身并不是这个实现中的 JWT token签发者,但明确使用 JWT 标准对未来联邦特性的实现 提供了支持(例如 OAuth2)。

为了配置 API 身份验证,需要先使用任意 JWT token 兼容工具(如https://jwt.io/) 和 secret 来生成您的 token。

注意,这个 secret 仅仅用来生成 token,Dapr 不需要知道或存储它

在 Dapr 中配置 API 令牌身份验证

令牌认证配置在 Kubernetes 和 自托管 Dapr deployments 下稍有不同:

自托管

在自托管场景中, Dapr 查找是否存在 DAPR_API_TOKEN 环境变量。 如果设置了该环境变量,当 daprd 进程启动时,Dapr 将对其公开的 APIs 强制执行身份验证:

export DAPR_API_TOKEN=<token>

如果需要更新已配置的 token,只需将 DAPR_API_TOKEN 环境变量设置为新值,然后重新启动 daprd 进程。

Kubernetes

在 Kubernetes deployment 里,Dapr 借助 Kubernetes secrets store 保存 JWT token。 配置 Dapr API 认证,需要创建新的 secret:

kubectl create secret generic dapr-api-token --from-literal=token=<token>

注意,上述秘密需要在你希望开启 Dapr token 认证的命名空间中创建

指定 Dapr 使用该秘密来保护其公有 API,需要在你的 Deployment template spec 中添加注解:

annotations:
  dapr.io/enabled: "true"
  dapr.io/api-token-secret: "dapr-api-token" # name of the Kubernetes secret

当 Deployment 部署后,Dapr sidecar 注入器会自动创建秘密,并将实际值注入到 DAPR_API_TOKEN 环境变量中。

更新令牌

自托管

如果需要更新已配置的令牌,只需将环境变量 DAPR_API_TOKEN 设置为新值,然后重新启动 daprd 进程。

Kubernetes

要在 Kubernates 中轮换配置的令牌,请使用每个命名空间中的新令牌更新以前创建的秘密。 您可以使用 kubectl patch 命令执行此操作,但更简单的方法是,使用 manifest 更新每个命名空间中的这些对象:

apiVersion: v1
kind: Secret
metadata:
  name: dapr-api-token
type: Opaque
data:
  token: <your-new-token>

然后将其应用于每个命名空间:

kubectl apply --file token-secret.yaml --namespace <namespace-name>

为了让 Dapr 开始使用新令牌,需要对你的每个 deployment 进行滚动升级:

kubectl rollout restart deployment/<deployment-name> --namespace <namespace-name>

请注意,假设您的服务配置了多个副本,则密钥轮换过程不会导致任何停机时间。

将 JWT token 添加到客户端 API 调用

在 Dapr 中配置令牌身份验证后,所有调用 Dapr API 的客户端都必须将 JWT 令牌附加到每个请求:

HTTP

如果是 HTTP ,那么 Dapr 将检查在 HTTP 请求头中否存在 dapr-api-token 参数 :

dapr-api-token: <token>

gRPC

当使用 gRPC 协议时,Dapr 将检查入站 gRPC 请求的元数据(metadata)上的 API 令牌 :

dapr-api-token[0].

从应用访问令牌

Kubernetes

在 Kubernetes中,推荐将您的秘密挂载到 pod 的环境变量,如以下面示例中所示,一个叫做 dapr-api-token 的 Kubernetes secret 用于保存令牌。

containers:
  - name: mycontainer
    image: myregistry/myapp
    envFrom:
    - secretRef:
      name: dapr-api-token

自托管

在自托管模式下,您可以将令牌设置为应用程序的环境变量 :

export DAPR_API_TOKEN=<my-dapr-token>

相关链接