跳到主内容

Kubernetes

根据 Kubernetes 文档, Kubernetes 的 API Server 可以使用 OpenID Connect(OIDC)进行认证。本文将指导您如何使用Casdoor在Kubernetes中配置身份验证。

环境要求​

先决条件:

  • 一个Kubernetes集群。
  • 一个 Casdoor 应用,例如这个 演示网站。
  • kubectl命令工具(可选)。
备注

Kubernetes 的 oidc-issuer-url 只接受以 https:// 开头的地址。因此,您的Casdoor应用程序应部署在HTTPS网站上。

步骤1:创建一个Casdoor应用和用户账户进行身份验证​

在 Casdoor 中添加一个应用(例如 Kubernetes)。记下 Name、Organization、Client ID 和 Client secret。启用集群要用到的授权类型。

在 Casdoor 中创建应用 授权类型

添加一个用户;把 Organization 和 Signup application 设为你创建的应用。

在 Casdoor 中添加用户

步骤2:使用OIDC身份验证配置Kubernetes API服务器​

要启用 OIDC 插件,在 API server 上设置以下参数:

  • --oidc-issuer-url:提供商的地址,API server 通过它发现用于签名的公钥。
  • --oidc-client-id:所有令牌都必须是为这个客户端 ID 签发的。

本文使用minikube进行演示。启动 minikube 时用以下命令 为其 API server 配置 OIDC 插件:

minikube start --extra-config=apiserver.oidc-issuer-url=https://demo.casdoor.com --extra-config=apiserver.oidc-client-id=294b09fbc17f95daf2fe

步骤3:测试OIDC身份验证​

获取身份验证信息​

由于kubectl缺乏前端,可以通过向Casdoor服务器发送POST请求进行身份验证。下面是一段 Python 代码,它向 Casdoor 服务器发送 POST 请求, 获取 id_token 和 refresh_token:

import requests
import json

url = "https://demo.casdoor.com/api/login/oauth/access_token"
payload = json.dumps({
"grant_type": "password",
"client_id": "Kubernetes",
"client_secret": "72c65c3912aec24a9f3ec41b65a7577114ed2bae",
"username": "user_3u94sf",
"password": "123456"
})
response = requests.request("POST", url, data=payload)

print(response.text)

执行此代码后,您应收到类似于以下的响应:

{
"access_token": "xxx",
"id_token": "yyy",
"refresh_token": "zzz",
"token_type": "Bearer",
"expires_in": 72000,
"scope": ""
}

用获取到的 id_token 向 Kubernetes API server 认证。

基于HTTP请求的身份验证​

将令牌添加到请求头。

curl https://www.xxx.com -k -H "Authorization: Bearer $(id_token)"
  • https://www.xxx.com 是 Kubernetes API server 的部署地址。

基于Kubectl客户端的身份验证​

配置文件方法​

把以下配置写入 ~/.kube/config 文件。您应该用您之前获得的值替换配置文件中的每个配置项。

users:
- name: minikube
user:
auth-provider:
config:
client-id: Kubernetes
client-secret: 72c65c3912aec24a9f3ec41b65a7577114ed2bae
id-token: $(id_token)
idp-issuer-url: https://demo.casdoor.com
refresh-token: $(refresh_token)
name: oidc

用 kubectl 访问 API server。尝试运行一个测试命令。

kubectl cluster-info

命令行参数方法​

也可以在 kubectl 命令行参数中传入 id_token。

kubectl --token=$(id_token) cluster-info