使用令牌认证对Dapr请求进行身份验证

要求每个来自Dapr的API请求都包含一个认证令牌

对于一些构建块,例如pubsub、service-invocation和输入bindings,Dapr与应用程序通过HTTP或gRPC进行通信。 为了让应用程序能够验证来自Dapr sidecar的请求,您可以配置Dapr在HTTP请求的头部或gRPC请求的元数据中发送一个API令牌。

创建令牌

Dapr使用共享令牌进行API认证。您可以自由定义API令牌。

虽然Dapr对共享令牌没有强制格式,但一个好的做法是生成一个随机字节序列并将其编码为Base64。例如,这个命令生成一个随机的32字节密钥并将其编码为Base64:

openssl rand 16 | base64

在Dapr中配置应用API令牌认证

令牌认证配置在Kubernetes或selfhosted Dapr部署中略有不同:

Selfhosted

在selfhosted场景中,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模板规范中添加一个注解:

annotations:
  dapr.io/enabled: "true"
  dapr.io/app-token-secret: "app-api-token" # Kubernetes secret的名称

部署时,Dapr Sidecar Injector会自动创建一个secret引用并将实际值注入到APP_API_TOKEN环境变量中。

轮换令牌

Selfhosted

要在selfhosted中更新配置的令牌,修改APP_API_TOKEN环境变量为新值并重启daprd进程。

Kubernetes

要在Kubernetes中更新配置的令牌,修改之前创建的secret中的新令牌在每个命名空间中。您可以使用kubectl patch命令来完成此操作,但更简单的方法是使用清单更新这些:

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 sidecar在调用应用程序时总是会在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

Selfhosted

在selfhosted模式中,您可以将令牌设置为应用程序的环境变量:

export APP_API_TOKEN=<my-app-token>

相关链接