使用令牌认证对来自 Dapr 的请求进行身份验证
对于某些构建块,例如发布订阅、服务调用和输入绑定,Dapr 通过 HTTP 或 gRPC 与应用程序通信。 为了使应用程序能够对来自 Dapr 边车的传入请求进行身份验证,您可以配置 Dapr 在调用应用程序时发送 API 令牌,作为标头(在 HTTP 请求中)或元数据(在 gRPC 请求中)。
创建令牌
Dapr 使用共享令牌进行 API 身份验证。您可以自由定义要使用的 API 令牌。
虽然 Dapr 不对共享令牌施加任何格式限制,但一个良好的做法是生成一个随机字节序列并将其编码为 Base64。例如,以下命令生成一个随机的 32 字节密钥并将其编码为 Base64:
openssl rand 16 | base64
在 Dapr 中配置应用 API 令牌认证
令牌身份验证配置在 Kubernetes 或自托管 Dapr 部署中略有不同:
自托管
在自托管场景中,Dapr 会查找 APP_API_TOKEN 环境变量。如果在 daprd 进程启动时设置了该环境变量,Dapr 会在调用应用程序时包含令牌:
export APP_API_TOKEN=<token>
要轮换配置的令牌,请将 APP_API_TOKEN 环境变量更新为新值并重启 daprd 进程。
Kubernetes
在 Kubernetes 部署中,Dapr 利用 Kubernetes secrets 存储来保存共享令牌。首先,创建一个新的 secret:
kubectl create secret generic app-api-token --from-literal=token=<token>
注意,上述 secret 需要在您希望启用应用令牌身份验证的每个命名空间中创建
要指示 Dapr 在向应用程序发送请求时使用 secret 中的令牌,请在您的 Deployment 模板规范中添加一个 annotation:
annotations:
dapr.io/enabled: "true"
dapr.io/app-token-secret: "app-api-token" # Kubernetes secret 的名称
部署后,Dapr Sidecar Injector 会自动创建 secret 引用并将实际值注入 APP_API_TOKEN 环境变量。
轮换令牌
自托管
要在自托管环境中轮换配置的令牌,请将 APP_API_TOKEN 环境变量更新为新值并重启 daprd 进程。
Kubernetes
要在 Kubernetes 中轮换配置的令牌,请使用新令牌更新每个命名空间中先前创建的 secret。您可以使用 kubectl patch 命令执行此操作,但在每个命名空间中更新这些 secret 的更简单方法是使用清单:
apiVersion: v1
kind: Secret
metadata:
name: app-api-token
type: Opaque
data:
token: <your-new-token>
然后将其应用到每个命名空间:
kubectl apply --file token-secret.yaml --namespace <namespace-name>
要告知 Dapr 开始使用新令牌,请触发每个部署的滚动升级:
kubectl rollout restart deployment/<deployment-name> --namespace <namespace-name>
假设您的服务配置了多个副本,密钥轮换过程不会导致任何停机时间。
对来自 Dapr 的请求进行身份验证
一旦使用环境变量或 Kubernetes secret app-api-token 配置了应用令牌身份验证,Dapr 边车在调用应用程序时始终包含 HTTP 标头/gRPC 元数据 dapr-api-token: <token>。在应用程序端,确保您使用 dapr-api-token 值进行身份验证,该值使用您设置的 app-api-token 来对来自 Dapr 的请求进行身份验证。

HTTP
在您的代码中,在传入请求中查找 HTTP 标头 dapr-api-token:
dapr-api-token: <token>
gRPC
使用 gRPC 协议时,检查传入调用中的 gRPC 元数据上的 API 令牌:
dapr-api-token[0].
从应用程序访问令牌
Kubernetes
在 Kubernetes 中,建议将 secret 作为环境变量挂载到您的 pod 中。
假设我们创建了一个名为 app-api-token 的 secret 来保存令牌:
containers:
- name: mycontainer
image: myregistry/myapp
envFrom:
- secretRef:
name: app-api-token
自托管
在自托管模式下,您可以为应用程序将令牌设置为环境变量:
export APP_API_TOKEN=<my-app-token>