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)、iss、aud、exp 與必要角色。失敗 → 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()
}
}