指南:获取密钥

使用密钥存储构建块安全地获取密钥

This article provides guidance on using Dapr’s secrets API in your code to leverage the secrets store building block. 密钥 API 允许您从配置的密钥存储轻松获取应用程序代码中的密钥。

建立一个密钥存储

在获取应用程序代码中的密钥之前,您必须配置一个密钥存储组件。 就本指南而言,作为一个示例,您将配置一个本地的密钥存储,该仓库使用本地的 JSON 文件来存储密钥。

注意:此示例中使用的组件未被加密且不推荐用于生产部署。 You can find other alternatives here.

创建一个名为 secrets.json 的文件,包含以下内容:

  1. {
  2. "my-secret" : "I'm Batman"
  3. }

将您的组件文件创建一个目录,名为 components ,并在其中创建一个名为 localSecretStore.yaml 的文件,并包含以下内容:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: my-secrets-store
  5. namespace: default
  6. spec:
  7. type: secretstores.local.file
  8. version: v1
  9. metadata:
  10. - name: secretsFile
  11. value: <PATH TO SECRETS FILE>/mysecrets.json
  12. - name: nestedSeparator
  13. value: ":"

请确保用您刚刚创建的 JSON 文件的路径替换 <密钥路径>

To configure a different kind of secret store see the guidance on how to configure a secret store and review supported secret stores to see specific details required for different secret store solutions.

获取密钥

现在运行 Dapr sidecar (在没有应用程序的情况下)

  1. dapr run --app-id my-app --port 3500 --components-path ./components

现在你可以通过使用密钥 API 调用 Dapr sidecar 来获得密钥:

  1. curl http://localhost:3500/v1.0/secrets/my-secrets-store/my-secret

For a full API reference, go here.

从你的代码调用密钥 API

一旦您设置了一个密钥存储,您可以调用 Dapr 从您的应用程序代码中获取密钥。 以下是不同编程语言的几个示例:

  1. import (
  2. "fmt"
  3. "net/http"
  4. )
  5. func main() {
  6. url := "http://localhost:3500/v1.0/secrets/my-secrets-store/my-secret"
  7. res, err := http.Get(url)
  8. if err != nil {
  9. panic(err)
  10. }
  11. defer res.Body.Close()
  12. body, _ := ioutil.ReadAll(res.Body)
  13. fmt.Println(string(body))
  14. }
  1. require('isomorphic-fetch');
  2. const secretsUrl = `http://localhost:3500/v1.0/secrets`;
  3. fetch(`${secretsUrl}/my-secrets-store/my-secret`)
  4. .then((response) => {
  5. if (!response.ok) {
  6. throw "Could not get secret";
  7. }
  8. return response.text();
  9. }).then((secret) => {
  10. console.log(secret);
  11. });
  1. import requests as req
  2. resp = req.get("http://localhost:3500/v1.0/secrets/my-secrets-store/my-secret")
  3. print(resp.text)
  1. #![deny(warnings)]
  2. use std::{thread};
  3. #[tokio::main]
  4. async fn main() -> Result<(), reqwest::Error> {
  5. let res = reqwest::get("http://localhost:3500/v1.0/secrets/my-secrets-store/my-secret").await?;
  6. let body = res.text().await?;
  7. println!("Secret:{}", body);
  8. thread::park();
  9. Ok(())
  10. }
  1. var client = new HttpClient();
  2. var response = await client.GetAsync("http://localhost:3500/v1.0/secrets/my-secrets-store/my-secret");
  3. response.EnsureSuccessStatusCode();
  4. string secret = await response.Content.ReadAsStringAsync();
  5. Console.WriteLine(secret);
  1. <?php
  2. require_once __DIR__.'/vendor/autoload.php';
  3. $app = \Dapr\App::create();
  4. $app->run(function(\Dapr\SecretManager $secretManager, \Psr\Log\LoggerInterface $logger) {
  5. $secret = $secretManager->retrieve(secret_store: 'my-secret-store', name: 'my-secret');
  6. $logger->alert('got secret: {secret}', ['secret' => $secret]);
  7. });

相关链接