跳至主要内容

02 — 身分驗證

Zitadel machine-to-machine 流程

每個 producer 都是 Zitadel 的 service user。它以憑證換取短效 JWT,API 再以快取的 JWKS 在本機驗證該 token——每個請求都不需要往返 Zitadel。

流程

1 · 取得 token

Producer 以 grant_type=client_credentials 呼叫 Zitadel 的 token endpoint(或以簽章的 JWT-profile assertion 做 keypair 驗證)。

2 · 收到 access JWT

Zitadel 回傳一個簽章過、scope 限定在 API audience(project:id:…:aud)的 JWT,一般有效約 1 小時。

3 · 呼叫 ingest API

Authorization: Bearer <jwt> 送出事件。

4 · 本機驗證

Gin middleware 檢查簽章(快取的 JWKS)、issaudexp 與必要角色。失敗 → 401/403

範例

① token 請求 → Zitadel

curl -s https://<tenant>.zitadel.cloud/oauth/v2/token \
-d grant_type=client_credentials \
-d scope="openid urn:zitadel:iam:org:project:id:<pid>:aud" \
-u "$CLIENT_ID:$CLIENT_SECRET"
# → { "access_token": "eyJ…", "expires_in": 3599 }

④ Gin middleware — 本機驗證

func RequireM2M(v *oidc.Verifier) gin.HandlerFunc {
return func(c *gin.Context) {
tok := bearer(c.GetHeader("Authorization"))
claims, err := v.Verify(c, tok) // JWKS-cached
if err != nil { c.AbortWithStatus(401); return }
if !claims.HasRole("audit.writer") {
c.AbortWithStatus(403); return
}
c.Set("client_id", claims.Subject)
c.Next()
}
}