认证

描述了 Cluster Optimizer API 认证的详细步骤。

本节描述了 Cluster Optimizer API 认证的详细步骤。

概述

通过 HTTP API 进行身份验证对于保护资源和确保只有授权用户和服务可以访问数据至关重要。

  • API 身份验证:API 使用基于令牌的身份验证机制,确保对集群数据和操作的安全访问。用户首先需要通过集群优化器界面生成 API 令牌,然后在所有 API 请求中使用该令牌进行身份验证。
  • 基于角色的访问控制 (RBAC):API 与平台的 RBAC 系统集成,确保用户在访问或修改资源时拥有适当的权限。

Cluster Optimizer API 通过 HTTP 头 Authorization 提供身份验证。示例如下:

GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer <Access_Token>

生成访问令牌Access Token

要使用 Access KeyAccess Key Secret 生成 Access Token,通常使用签名算法(如 HMAC)来创建唯一的安全密钥,用于 API 请求的身份验证。以下是生成 API 密钥的详细步骤:

1. 准备您的 Access Key 和 Secret

您通常会获得 Access Key(公开标识符)和 Access Key Secret(私有标识符)。Access Key 用于标识客户端,Access Key Secret 用于安全地签署和验证 API 请求。

2. 生成要签名的消息

在生成签名的 API 密钥之前,您需要创建一个消息,将几个元素通过 : 作为分隔符组合:

  • Access Key:客户端的公开标识符。
  • Timestamp:为了防止重放攻击,包含一个时间戳(以纳秒为单位)。
  • Nonce:防止重放攻击的随机字符串。

例如(在 Go 语言中):

message := fmt.Sprintf("%s:%d:%s", accessKeyID, timestamp, nonce)

在此示例中,accessKeyID 是客户端的访问密钥 ID,timestamp 是以纳秒为单位的时间戳,nonce 是一个随机字符串。

3. 使用 HMAC-SHA256 签名消息

接下来使用 API key secret 通过 HMAC-SHA256 生成签名。此签名确保请求未被篡改,并且客户端是合法的。

示例(Go 语言)如下:

func generateSignature( keyID string, keySecret string, timestamp int64, nonce string) (string, error) {
  message:=fmt.Sprintf("%s:%d:%s", keyID, timestamp, nonce)
  h:=hmac.New(sha256.New, []byte(keySecret))
  if _, err:=h.Write([]byte(message)); err!=nil {
    return"", err
  }
  signature:=base64.StdEncoding.EncodeToString(h.Sum(nil))
  returnsignature, nil
}

以下是所要求的中文翻译:

此函数通过使用 API Key SecretHMAC-SHA256 算法对消息进行哈希处理来生成 signature

4. 构建访问令牌

生成签名后,您可以通过组合 Access Token(公开)和生成的签名(私有)来构建最终的 API 密钥。

带有签名 API 密钥的请求示例:

GET /api/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer <accessKey>/<timestamp>/<nonce>/<signature>
  • accessKey 是公共的访问密钥。

  • timestamp:为防止重放攻击,包含一个以纳秒为单位的时间戳。

  • nonce:用于防止重放攻击的随机字符串。

  • signature 是使用密钥通过 HMAC-SHA256 签名的消息。

    示例(Go 语言)如下:

    func GenerateAccessToken(keyID string, keySecret string, timestamp int64, nonce string) (string, error) {
        if timestamp==0 {
            timestamp=time.Now().UTC().UnixNano()
        }
        signature, err := generateSignature(keyID, keySecret, timestamp, nonce)
        if err != nil {
            return "", err
        }
        return utils.URLEncode(fmt.Sprintf("%s/t%d/t%s/t%s", keyID, timestamp, nonce, signature)), nil
    }
    

5. 构建 HTTP 请求

您可以使用生成的访问令牌以及 open api 规范提供的方法来构建 HTTP 请求。

示例(Go 语言)如下:

client := NewAPIClient(&Configuration{
    BasePath: "http://api.example.com",
})
apiKey := "AKFgGMF3FWWe5mgkz3UWBMgaUgrzBMUV"
apiSecret := "******"
nonce := "NONe5mgkz3GBk"
accessToken, _ := GenerateAccessToken(apiKey, apiSecret, 0, nonce)
ctx := context.Background()
ctx = context.WithValue(ctx, ContextAccessToken, accessToken)
rules, _, err := client.NotificationRuleApi.ListNotificationRules(ctx, &NotificationRuleApiListNotificationRulesOpts{})

下一步

下面,我们将探讨关注如下API:

  • 管理 API:管理集群、集群访问账户、访问密钥、通知渠道、通知规则等。
  • 优化 API:提供针对 Kubernetes 资源(如节点组、持久卷、工作负载等)的推荐和优化。