OAuth and OIDC Integration in Kafka

OAuth and OIDC Integration in Kafka

A complete, plain-English guide to letting your identity provider decide who can talk to your Kafka cluster: how tokens, brokers, and access rules fit together, where things break, and how to run it safely in production.

Imagine a huge concert hall with thousands of doors. Every second, thousands of people walk in and out, and each of them carries something valuable: a message that must reach the right room. Now imagine the hall has no guards. Anyone can walk in, read any message, or drop a fake one into any room. That is what a freshly installed Apache Kafka cluster looks like by default.

This guide shows how to put a smart, modern guard at every door. Instead of Kafka keeping its own long list of usernames and passwords, it asks a trusted identity system to hand out short-lived digital passes. Kafka only has to check the pass. That idea is called OAuth 2.0, and its identity companion is called OpenID Connect (OIDC). By the end, you will understand every moving part, from the first request for a pass to the moment the pass expires and gets renewed.

We will start from zero. Every new word is explained the first time it appears, and every big idea comes with an everyday comparison. Take it one chapter at a time, and the whole picture will click into place.

1The Problem: Who Is Knocking at the Kafka Door?

Before learning the solution, we need to feel the problem. Kafka moves the most sensitive data in a company, and by default it trusts everyone.

Apache Kafka is a system that moves streams of events between programs. An event can be anything: a payment was made, a driver moved, a video started playing. Kafka was created at LinkedIn and released as open source in 2011. Today, companies such as LinkedIn, Netflix, and Uber run it to move enormous volumes of events, often trillions of messages per day across the industry.

Out of the box, Kafka listens on a plain network port. It does not ask who you are. If your program can reach the port, it can read and write. That is fine on a laptop for learning. It is a disaster in a company where the same cluster carries payment events, customer addresses, and internal alerts.

Analogy

Think of an apartment building with no front-door lock. The mail room sits right inside. Anyone can walk in, open any mailbox, read the letters, and even slip in fake ones. Adding locks is step one. But a building with 5,000 residents also needs a smart way to decide who gets a key, when the key stops working, and who can open which mailbox. That is the real job.

Why passwords stored in Kafka do not scale

Kafka does support built-in password systems. But picture a company with 400 services and 3,000 employees. Each service has a password saved in Kafka’s own settings. When a person leaves the company, someone must remember to remove their Kafka login in addition to everything else. Passwords live for years, get copied into config files, and leak into chat messages. Rotating them means restarting programs.

Meanwhile, the company already runs an identity provider (often shortened to IdP). This is a central service that knows every person and every application, and that already handles login, multi-factor checks, and offboarding. Examples include Keycloak, Okta, Auth0, Microsoft Entra ID, and Google’s identity platform. The smart move is to let Kafka trust that one system instead of running a second, weaker copy.

1
central place that knows who everyone is
Minutes
typical lifetime of a token, not years
0
long-term passwords stored inside Kafka

What we want to achieve

Goal 1

One source of truth

Identity lives in the identity provider. Disable a service there, and it loses Kafka access without touching Kafka.

Goal 2

Short-lived access

Passes expire fast. A stolen pass is useful for minutes, not months.

Goal 3

No shared secrets on brokers

Brokers only hold public information needed to check a pass. They never see a client’s password.

Goal 4

Clear audit trail

Every action can be tied back to a named application or person.

i
Good to know

OAuth and OIDC do not replace Kafka’s access rules. They answer “who are you?”. A separate part of Kafka still answers “what are you allowed to do?”. We cover both in this guide.

2Kafka in Plain Words

A short refresher on the Kafka pieces we will be protecting. If you already know Kafka, skim this and move on.

Kafka is built from a handful of simple ideas. Once you know them, the security story becomes much easier to follow.

Storage

Topic

A named channel for events, such as “orders” or “payments”. Think of it as a labeled mailbox that keeps every letter in order.

Storage

Partition

A topic is split into partitions so many machines can share the work. Each partition is an ordered log.

Server

Broker

One Kafka server. A cluster has several brokers that store partitions and answer client requests.

Client

Producer

A program that writes events to a topic.

Client

Consumer

A program that reads events from a topic. Consumers often work together in a consumer group to share the reading.

Control

Controller

The part of the cluster that tracks which broker owns which partition. Modern Kafka runs this itself using a system called KRaft.

Analogy

A Kafka cluster is like a giant post office. Topics are the labeled sorting shelves. Partitions are the individual slots on each shelf. Brokers are the postal workers behind the counter. Producers are people dropping letters off, and consumers are people picking letters up. The controller is the manager who decides which worker handles which shelf.

Where security touches this picture

Every arrow in that picture is a network connection that needs protection. A producer talks to a broker. A consumer talks to a broker. Brokers talk to each other to copy data, so that losing one machine does not lose events. The controller talks to brokers. Admin tools talk to everything.

Each connection has two ends, and each end must prove who it is. Then the receiving side must decide if that identity is allowed to do what it is asking. Kafka calls the “who” part authentication and the “may they” part authorization.

Listeners: the doors of a broker

A broker opens one or more listeners. A listener is a network address and port with a chosen security style. One listener might be plain and open for local testing. Another might require encryption and a login. A common pattern is to give clients one listener, brokers a second one for copying data between themselves, and the controller a third.

The listener’s security style is set by a protocol name. Four exist: PLAINTEXT (no protection), SSL (encrypted, and optionally certificate-checked), SASL_PLAINTEXT (login without encryption), and SASL_SSL (login plus encryption). OAuth-based login belongs to the SASL family, and in production it should always sit on SASL_SSL.

!
Watch out

SASL_PLAINTEXT with OAuth tokens is a trap. The token travels in the open, and anyone watching the network can copy it and reuse it until it expires. Always encrypt the connection.

3Authentication, Authorization, and Kafka’s Security Layers

Three words cause endless confusion: encryption, authentication, authorization. Let us pull them apart cleanly.

Analogy

Picture an airport. The sealed tunnel between the check-in hall and the plane is encryption: nobody outside can see who walks through. The passport check is authentication: it proves you are who you claim to be. The boarding pass is authorization: it says which plane, which seat, and which lounge you may enter. A passport alone does not get you on every flight.

1

Encryption (TLS)

Scrambles the conversation so eavesdroppers see noise. Protects the pass while it travels.

2

Authentication (SASL or mutual TLS)

The client proves its identity. This is where OAuth tokens are checked.

3

Authorization (ACLs)

Kafka checks whether the proven identity may read, write, create, or delete the specific thing it asked for.

What is SASL?

SASL stands for Simple Authentication and Security Layer. It is not one login method. It is a small frame that lets a client and server agree on which login method, called a mechanism, to use. Kafka supports several mechanisms behind that frame.

MechanismHow the client proves itselfWhere the secrets live
PLAINSends a username and passwordStored with the broker or an external check
SCRAMProves it knows the password without sending itSalted hashes stored in the cluster
GSSAPI (Kerberos)Uses tickets from a Kerberos serverKerberos infrastructure
OAUTHBEARERSends a short-lived signed token from an identity providerThe identity provider; brokers hold only public keys

Kafka can also identify clients by certificate alone, which is called mutual TLS or mTLS. It is strong, but managing certificates for thousands of short-lived workloads can be heavy. OAUTHBEARER trades certificate handling for token handling, and it plugs into the identity system the company already runs.

What is authorization in Kafka?

After login, Kafka builds a principal, which is simply the name Kafka will use for this client from now on, written like User:billing-service. An ACL (access control list) is a rule such as “this principal may write to this topic”. Kafka checks the rules on every request. If no rule allows the action, it is refused.

i
Key idea

OAuth or OIDC feeds the name of the principal into Kafka. Kafka’s own ACL system still decides what that name can do, unless you plug in a different authorizer.

4OAuth 2.0 from Zero

OAuth is a way to grant limited access without handing over a password. It sounds abstract, but the everyday version is simple.

OAuth 2.0 is an industry standard (described in a document called RFC 6749) for letting one program get permission to use another service, without ever learning anyone’s long-term password. You have used it whenever a website offered “Sign in with Google”. The website never sees your Google password. It just receives a limited pass.

Analogy

A hotel does not give guests the master key. At check-in, the front desk checks your identity and hands you a key card that opens your room, only for the nights you booked. When the stay ends, the card stops working. OAuth works the same way: the identity provider is the front desk, the token is the key card, and Kafka is the door that reads it.

The four roles

Role

Resource owner

Whoever owns the data or the right to grant access. For services, this is effectively the organization that configured them.

Role

Client

The program that wants access. In our story, a Kafka producer or consumer.

Role

Authorization server

The identity provider that checks the client and issues tokens.

Role

Resource server

The system being protected. Here, the Kafka broker.

The access token

The star of OAuth is the access token. It is a small piece of text that says, in effect, “the holder of this text may do these things until this time”. The client gets it from the authorization server and shows it to the resource server. Because whoever holds the text can use it, it is called a bearer token: the bearer of it gets the access. That is convenient, and it is exactly why tokens must be short-lived and sent only over encrypted connections.

Grant types: different ways to get a token

A grant type is the method a client uses to earn a token. Different situations call for different methods.

Grant typeBest forHuman involved?
Client credentialsServer-to-server work, like a Kafka producer serviceNo
Authorization code (with PKCE)Web or mobile apps where a person signs inYes
Device codeCommand-line tools and devices with no browserYes, on another screen
Refresh tokenGetting a new access token without asking the person againNot again

For Kafka, the star is client credentials. Most Kafka clients are programs running without a person nearby: a payment service, a data pipeline, a stream processor. Each one has a client ID (its public name) and a client secret (its private password, kept only by that program and the identity provider). It sends both to the identity provider’s token endpoint and receives an access token in return.

Scopes

A scope is a label naming a slice of permission, such as “kafka:produce” or “orders:read”. The identity provider can put scopes inside the token. This lets a token be narrower than the client’s full rights. Later we will see an important detail: the default Kafka authorizer does not read scopes on its own, so scopes are a signal that needs extra wiring to become real rules.

!
Common myth

“OAuth is authentication.” Strictly, OAuth is about delegated access. It says the holder may do something, and it says little about who the person is. That gap is why OpenID Connect exists, which is the next chapter.

5OpenID Connect: Adding “Who Are You?” to OAuth

OIDC sits on top of OAuth and fills the identity gap. It is the reason people say “OAuth/OIDC” as if they were one thing.

OpenID Connect, or OIDC, is a thin layer built on top of OAuth 2.0. OAuth alone gives a program a pass. OIDC adds a second item that clearly states who the person or service is. That second item is called the ID token. It is meant for the client application to read, so it can know who just signed in.

Analogy

Back at the hotel: the key card (access token) opens the door, but it does not have your name on it. The registration slip (ID token) carries your name and check-in details. The key card is for doors. The slip is for people to read. Mixing them up causes real mistakes, so keep the difference in mind.

What OIDC adds

Addition

ID token

A signed statement about who authenticated, when, and how. Always a JWT, which we meet in the next chapter.

Addition

Standard scopes

Agreed names such as “openid”, “profile”, and “email” that ask for identity details in a common way.

Addition

Discovery document

A public web page at a well-known address listing the provider’s endpoints and signing keys, so software can configure itself.

Addition

UserInfo endpoint

A place to ask for more profile details about the signed-in person, using the access token.

The discovery document: a phone book for software

Every OIDC provider publishes a discovery document at an address ending in a fixed, well-known path. It lists the provider’s issuer name, its token endpoint, where to find its public signing keys, and more. Instead of copying five addresses by hand into every program, a program reads this one page. For Kafka, the most useful facts inside it are the token endpoint (where clients get tokens) and the JWKS address (where brokers fetch keys to check tokens).

So where does OIDC fit in Kafka?

This is the most misunderstood point, so let us be very plain. Kafka brokers check access tokens. They do not do the browser login screen, and they do not expect an ID token. OIDC matters in three ways:

  1. The provider you choose is an OIDC provider. Keycloak, Okta, Entra ID and others speak OIDC. Their discovery documents tell you where the token endpoint and keys live.
  2. The token format follows OIDC conventions. Claims such as issuer, subject, audience, and expiry come from the same family of standards.
  3. Human-facing tools use the full OIDC login. A web dashboard for Kafka has a person sign in with the browser flow. The dashboard then uses the resulting identity to act on the person’s behalf.
i
Rule of thumb

Machines to Kafka: OAuth access token via client credentials. People to a Kafka tool: OIDC login in the tool. The tool then talks to Kafka with its own approved identity or a token that represents the person.

6Tokens and JWTs: The Digital Wristband

To trust a token without phoning anyone, Kafka must be able to check it on its own. That is what a signed token allows.

Tokens come in two flavors. An opaque token is just a random-looking string. Only the identity provider knows what it means, so the receiver must call the provider to ask. A self-contained token carries its own facts inside it, along with a signature that proves nobody has tampered with it. The most common self-contained format is the JWT, pronounced “jot”, short for JSON Web Token (RFC 7519).

Analogy

A concert wristband works like a JWT. The staff do not phone the ticket office for every guest. The band itself has a hologram only the organizer can print. A quick look proves it is real, and the color tells staff which area you may enter. An opaque token is more like a ticket number: staff must look it up in the office computer each time.

Three parts, separated by dots

H

Header

Says how the token was signed, for example which algorithm, and which key was used (a key ID).

P

Payload (claims)

The facts: who issued it, who it is about, who it is for, when it expires, and which scopes it carries.

S

Signature

A mathematical seal made with the provider’s private key. Anyone with the matching public key can verify it, but nobody can forge it.

The claims Kafka cares about

ClaimMeaningWhy Kafka looks at it
iss (issuer)Who created the tokenMake sure it came from the expected identity provider
sub (subject)Who the token is aboutBy default, this becomes the Kafka principal name
aud (audience)Who the token is meant forStops a token made for another system from working on Kafka
exp (expiry)When it stops being validSets the maximum lifetime of the connection’s login
iat and nbfIssued-at and not-before timesReject tokens from the future or with odd timing
scopeThe permission labels grantedAvailable to custom logic; not used by default ACLs

Public keys and JWKS

The identity provider signs tokens with a private key it never shares. It publishes the matching public keys in a standard list called a JWKS (JSON Web Key Set), served at a web address. A broker downloads this list, keeps it in memory, and uses it to check signatures. Each key has an ID, and the token header names the ID, so the broker knows which key to use.

This design has a lovely property. The broker never sends anything secret and never needs the client’s password. It only needs public information. Even if someone steals a broker’s memory, they cannot mint new tokens.

!
Watch out

A JWT is signed, not encrypted. Anyone holding it can read the claims. Never put secrets, passwords, or private customer data inside token claims.

7SASL/OAUTHBEARER: How Kafka Speaks OAuth

Kafka does not talk to your identity provider directly during a connection. It has a specific login mechanism that carries the token. Here is how it works.

OAUTHBEARER is the SASL mechanism that carries OAuth bearer tokens. It is defined in a standard called RFC 7628, and it works with the token style from RFC 6750. Kafka added support in version 2.0. The idea is small: the client sends one message containing the token, and the server answers with success or failure.

The two halves

Two separate jobs happen in two separate places, and each job is handled by a small plug-in piece of code called a callback handler.

Client side

Login callback handler

Runs inside the producer, consumer, or admin client. Its job: get a token from the identity provider, and refresh it before it expires.

Broker side

Validator callback handler

Runs inside the broker. Its job: take the token a client sent and decide if it is valid, then tell Kafka who the client is.

Analogy

At a theme park, one worker at the ticket booth (the login handler) gets you a wristband. Another worker at each ride entrance (the validator) checks that the wristband is real and still valid. They never need to talk to each other. They both trust the park’s hologram design.

The history in short

1

Kafka 2.0: the mechanism arrives

The framework and a demo handler that accepts unsigned tokens. It exists for learning and testing only. Nobody should use it in production because it trusts anything.

2

Kafka 2.2: re-authentication

Long-lived connections can log in again on the same connection, so expiring tokens no longer force a full reconnect.

3

Kafka 3.1: production-ready handlers built in

Ready-made handlers that fetch tokens with the client credentials grant and validate signed JWTs using a JWKS address. Before this, teams wrote their own code or used a vendor library.

4

Later releases: safer and broader

Newer versions have added extra login options and safeguards, such as limits on which web addresses the OAuth code is allowed to contact. Check your release notes for what your version supports.

Built-in versus third-party libraries

Some teams use the handlers that ship with Kafka. Others use a library from a vendor or community project. The well-known open-source example is the OAuth library maintained by the Strimzi project, which runs Kafka on Kubernetes. It supports checking JWTs, and also supports opaque tokens by calling the provider’s introspection endpoint. Confluent’s platform likewise offers OAuth and OIDC integration with identity providers.

ChoiceStrengthTrade-off
Built-in Kafka handlersNo extra software; fully supported by the Kafka projectFocused on the common cases; fewer knobs
Community library such as Strimzi’sOpaque tokens, richer authorization options, mature Kubernetes toolingOne more dependency to patch and upgrade
Vendor platform featuresIntegrated identity mapping and group-based rulesTied to that platform
Custom handlerTotal controlYou own the security bugs
!
Never in production

The default “unsecured” OAuth handler accepts tokens that have no real signature. It is a test tool. If you ever see it configured on a shared cluster, treat it as an open door.

8Architecture and Components

Now we assemble every piece into one picture. Study the diagram, then read the roles below it.

flowchart LR
  subgraph Clients["Kafka Clients"]
    P["Producer Service"]
    C["Consumer Service"]
    A["Admin Tool"]
  end
  subgraph IdP["Identity Provider"]
    TE["Token Endpoint"]
    JW["JWKS Endpoint"]
    DIR["Client Registry and Policies"]
  end
  subgraph Cluster["Kafka Cluster over TLS"]
    LB["Bootstrap Address or Load Balancer"]
    B1["Broker 1 with Validator"]
    B2["Broker 2 with Validator"]
    B3["Broker 3 with Validator"]
    ACL["ACL Authorizer"]
  end
  P -->|"1 request token"| TE
  C -->|"1 request token"| TE
  A -->|"1 request token"| TE
  TE --- DIR
  P -->|"2 connect with token"| LB
  C -->|"2 connect with token"| LB
  A -->|"2 connect with token"| LB
  LB --> B1
  LB --> B2
  LB --> B3
  B1 -.->|"fetch public keys"| JW
  B2 -.->|"fetch public keys"| JW
  B3 -.->|"fetch public keys"| JW
  B1 --> ACL
  B2 --> ACL
  B3 --> ACL
    
Figure 1: Clients get tokens from the identity provider, present them to brokers, and brokers verify them using published public keys.

Reading the diagram

Solid arrows are the main path. A client first visits the token endpoint and receives a token (step 1). It then connects to Kafka through the bootstrap address, which may be a load balancer or a list of broker names, and presents the token (step 2). Any broker can accept it, because every broker runs the same validator with the same settings.

The dotted arrows show background work. Each broker fetches the JWKS list from the identity provider and keeps it cached. This happens on a timer, not per request. That is why brokers can check thousands of logins per second without hammering the identity provider.

Component roles

IdP

Token endpoint

Receives the client ID and secret, checks them, applies policy, and returns a signed token.

IdP

JWKS endpoint

Serves the current public keys. Supports key rotation because it can list old and new keys together.

IdP

Client registry

The list of applications and their allowed settings: which scopes, how long tokens live, what audience.

Broker

Validator handler

Checks signature, expiry, issuer, and audience. Produces the identity used for the connection.

Broker

Principal builder

Turns the validated identity into the principal name that ACLs match against.

Broker

Authorizer

The gatekeeper that checks ACL rules on each request after login.

Client

Login handler

Fetches the first token, refreshes before expiry, and hands the fresh token to Kafka’s client code.

Network

TLS layer

Encrypts everything so tokens cannot be copied off the wire.

i
Design insight

The identity provider is on the path before the connection (client to token endpoint) and off the path during the connection. Brokers only need it for key downloads. So a short identity provider outage does not stop existing sessions, though new logins and refreshes will fail.

9Internal Working: The Handshake, Step by Step

Let us follow one producer from a cold start to its first message, watching every hand-off.

sequenceDiagram
  autonumber
  participant App as Producer App
  participant IdP as Identity Provider
  participant Br as Kafka Broker
  participant Keys as JWKS Endpoint
  App->>IdP: Request token using client ID and secret
  IdP->>IdP: Check credentials and apply policy
  IdP-->>App: Signed access token with expiry
  App->>Br: Open TLS connection
  Br-->>App: Server certificate
  App->>Br: SASL handshake choosing OAUTHBEARER
  Br-->>App: Mechanism accepted
  App->>Br: Send token in one authentication message
  Br->>Keys: Fetch public keys if not cached
  Keys-->>Br: Key set
  Br->>Br: Verify signature, expiry, issuer, audience
  Br-->>App: Authentication success with session lifetime
  App->>Br: Produce request for a topic
  Br->>Br: Build principal and check ACLs
  Br-->>App: Acknowledged
    
Figure 2: One full login and first write, from token request to acknowledged message.

Step 1 and 2: get the token

When the producer starts, its login handler contacts the token endpoint. It sends the client ID and client secret over an encrypted channel. The identity provider looks up that client, checks the secret, decides which scopes and audience to include, and signs a new token. The token comes back with an expiry time, usually a few minutes to an hour later.

Notice what Kafka is doing here: nothing. The token fetch happens in the client’s login code, using the client’s own web connection to the identity provider. Kafka’s network protocol is not involved yet.

Step 3 and 4: connect and pick a mechanism

The client opens a TLS connection to the broker. TLS first proves to the client that it reached the real broker, which protects against fake servers. Then the client sends a short handshake naming the mechanism it wants: OAUTHBEARER. The broker checks that it has this mechanism enabled on this listener. If not, it refuses, and the client sees an unsupported-mechanism error.

Step 5: send the token

The client sends a single authentication message that carries the token text. It may also include a few optional extra key-value pairs, called extensions, that the broker’s logic can read. Then the client waits.

Step 6: the broker checks the token

The validator handler follows a checklist. Any failure ends the login immediately.

a

Read the header

Find out which key ID was used to sign. Reject unexpected signing methods.

b

Find the key

Look in the cached key list. If the key ID is unknown, the broker may re-fetch the list, but only within safe limits so attackers cannot force endless downloads.

c

Verify the signature

Confirm the seal matches the header and payload.

d

Check the time

The token must not be expired and not be from the future. A small clock tolerance, by default around 30 seconds, forgives tiny differences between machine clocks.

e

Check issuer and audience

If configured, the token must name the expected issuer and be meant for this Kafka environment.

f

Read the subject

Pull out the claim that will become the principal name, and any scopes.

Step 7: success and session lifetime

If everything passes, the broker replies with success. If re-authentication is enabled, the reply also tells the client how long the session lasts. That lifetime is capped by the token’s expiry and by a broker setting for maximum session time, whichever is shorter. Think of it as the wristband’s printed end time.

Step 8: every request is authorized

From now on, every request on this connection carries the same identity. Before a broker lets a produce request write into a topic, it asks the authorizer: “May this principal write to this topic?” The answer is checked per request, not once per connection. So a rule change takes effect quickly, without waiting for the client to reconnect.

i
Performance note

Checking a signed token is pure math on data the broker already has. It typically costs a tiny slice of a millisecond, and it happens once per connection (plus once per re-authentication), not once per message. That is why token login does not become the bottleneck, even for clients that produce millions of messages.

10Data Flow and Token Lifecycle

Tokens expire on purpose. Kafka connections often stay open for days. Making these two facts live together peacefully is the heart of a healthy setup.

A Kafka producer or consumer opens a connection and keeps it for a long time. Reconnecting is expensive, because it involves rebalancing and short pauses. But a token might expire in 15 minutes. So what happens after 15 minutes on a connection that was authenticated with that token?

Analogy

A night shift security badge is valid for 8 hours. A guard who must stay past that time swaps for a fresh badge at the desk while still on duty, without leaving the building. Re-authentication is the same swap: the client presents a new token on the existing connection, without hanging up.

flowchart TD
  S["Client starts"] --> T1["Fetch token from identity provider"]
  T1 --> L1["Connect and authenticate with broker"]
  L1 --> U["Use the connection: produce and fetch"]
  U --> W{"About 80 percent of token lifetime passed?"}
  W -- "No" --> U
  W -- "Yes" --> R["Background refresh: fetch a new token"]
  R --> OK{"New token received?"}
  OK -- "Yes" --> RA["Re-authenticate on the same connection before session end"]
  RA --> U
  OK -- "No" --> RT["Retry with backoff until old token expires"]
  RT --> OK
  RT --> X["Old session ends and broker closes the connection"]
  X --> T1
    
Figure 3: The client refreshes early and re-authenticates in place. If refreshing keeps failing, the session finally ends and the client starts over.

Two clocks running side by side

There are two separate timers to understand.

Client clock

Login refresh

The client’s login code re-fetches a token before the old one runs out. By default, it starts at about 80 percent of the lifetime with a little random jitter, so thousands of clients do not all refresh in the same second.

Broker clock

Session lifetime

When re-authentication is on, the broker tracks when each session should end. If the client has not re-authenticated by then, the broker closes the connection.

What if re-authentication is not enabled?

Before Kafka 2.2, and whenever the broker setting for maximum session time is left off, the broker checks the token only once, at connection time. An already-connected client keeps working even after its token expires. That may feel convenient, but it is a security gap: a revoked or expired identity can keep streaming data for as long as the connection lives. Turning on re-authentication closes this gap, so the token’s expiry becomes a real limit.

!
Watch out

Re-authentication only helps when both sides support it. Old clients that do not know how to re-authenticate will be disconnected when the session ends. Upgrade clients before enforcing the setting cluster-wide.

The full data flow in three loops

1

Slow loop: keys

Brokers refresh the identity provider’s key list on a timer, roughly hourly by default. This covers key rotation.

2

Medium loop: tokens

Clients refresh tokens every few minutes to an hour, depending on how the provider is set up.

3

Fast loop: messages

Millions of produce and fetch requests flow on authenticated connections, each checked against ACLs, with no identity provider involved.

Choosing a token lifetime

Shorter lifetimes limit damage if a token leaks, but they create more traffic to the identity provider and more refresh moments that can fail. Longer lifetimes are calmer for operations but riskier. Many teams settle between 5 minutes and 1 hour for service tokens. The right number depends on how fast you need revocation to bite, and how reliable your identity provider is.

11Performance and Scalability

Will adding token login slow Kafka down? For message traffic, almost never. The pressure shows up in a different place: login bursts.

Where the cost really is

Kafka is famous for pushing huge volumes of data through a small number of long-lived connections. Authentication happens at the start of a connection and again at each renewal. It does not happen for each message. So the cost of checking a token is spread over millions of messages, and the per-message overhead is effectively zero.

The cost of one login has three parts. First, the network round trips: opening the connection, the encryption handshake, the mechanism handshake, and the token message. Second, the signature check, which is fast math and typically takes well under a millisecond on modern hardware. Third, the key lookup, which is a memory read when the key is already cached.

Analogy

Think of a stadium. Showing your ticket at the gate takes a few seconds, and it happens once. Then you watch the game for three hours. The gate is only a problem when 50,000 fans arrive in the same five minutes. Kafka’s login story is the same: not slow, but sensitive to sudden crowds.

The login storm

A login storm happens when many clients try to authenticate at nearly the same moment. Typical triggers include restarting a whole fleet of applications, a network blip that drops thousands of connections, or a rolling restart of brokers that pushes clients to reconnect elsewhere. Each reconnecting client may also need a fresh token, so the identity provider feels the burst as well.

Defense

Jitter

Add small random delays to refreshes and reconnects so clients spread out instead of marching in lockstep.

Defense

Backoff

When a login fails, wait longer between each retry. This keeps a struggling provider from being buried.

Defense

Token reuse

Reuse a token until it is close to expiry instead of asking for a new one on every reconnect.

Defense

Staggered rollouts

Restart applications in small batches, not all at once.

Sizing the identity provider

A simple estimate helps. Each client instance asks for a token roughly once per token lifetime, a bit earlier than expiry because of the refresh window. Take 5,000 client instances with a 5-minute lifetime, refreshing at around 4 minutes. That is about 1,250 token requests per minute, or roughly 21 per second. Stretch the lifetime to 60 minutes, refreshing near 48, and the same fleet needs only about 104 requests per minute. Shorter lifetimes are safer, but they multiply the load, so size the provider for the number you pick.

!
Hidden multiplier

Each Kafka client object usually logs in on its own. An application that creates ten producers and five consumers may be making fifteen separate token requests. Count client objects, not applications, when you estimate load.

Scaling the broker side

Token validation on a broker is stateless apart from the cached key list. Adding brokers adds more places to validate, and no coordination is needed between them. Key downloads come from every broker, but they happen on a timer, so even a hundred brokers produce only a trickle of requests. The authorizer keeps its rules in memory, so each request check is a fast lookup rather than a database trip.

The re-authentication moment

When a session renews, the connection briefly pauses new work while the fresh token is verified. For a healthy setup this takes a fraction of a second, but it is real. If thousands of connections share the same session length and started together, they will all renew together. Spreading start times, and letting the broker’s session limit vary a little, softens the wave.

12Authorization After Login: Principals, Scopes, and ACLs

Being let into the building is not the same as being allowed into every room. This chapter connects a token to real permissions.

From token to principal

By default, Kafka takes one claim from the token, the subject, and makes it the principal’s name. If the subject is “orders-service”, the principal is User:orders-service. You can point Kafka at a different claim, which helps when the subject is an unreadable ID and another claim holds a friendly name.

Then ACL rules attach to that name. A rule has five parts: the principal, the action (read, write, create, and so on), the resource (a topic, a consumer group, the cluster), whether it allows or denies, and which hosts it applies to. Kafka denies by default: no rule, no access.

QuestionWho answers itWhere the answer lives
Is this token genuine?Broker validatorPublic keys from the identity provider
What is this client called?Principal builderA claim in the token
May this name write to this topic?AuthorizerACLs stored in the cluster

The scope gap

Here is a detail that surprises many teams. The standard Kafka authorizer looks at the principal name only. It does not read the token’s scopes, and it has no built-in idea of groups. So even if the identity provider issues a token with “read-only” in its scopes, Kafka’s default rules will not automatically hold the client to read-only. You must either write ACLs for that principal, or add logic that uses scopes.

Analogy

Imagine a guard who checks your name against a paper list and ignores the colored sticker on your badge. The badge printer may print “visitor only” stickers all day, but the guard’s list is what counts. To make the sticker matter, you must retrain the guard or rewrite the list.

Three ways to bridge the gap

Option A

One identity per role

Create separate client identities such as “orders-writer” and “orders-reader” at the identity provider, then write matching ACLs. Simple and transparent, but can multiply identities.

Option B

Custom principal builder

Write code that turns claims such as groups into extra principal names, so ACLs can be written once per group. More flexible, more code to maintain.

Option C

Different authorizer

Use a plug-in authorizer, such as one that reads scopes or delegates to a policy engine or a vendor’s role-based system. Most powerful, but a bigger commitment.

Least privilege in practice

Least privilege means giving each identity exactly the access it needs and nothing more. For Kafka, that usually means: one identity per application, write access only to the topics it owns, read access only to the topics and consumer groups it needs, and no cluster-wide powers except for a handful of admin identities. Treat wildcard rules as a red flag.

Example: an order pipeline

The checkout service writes to the “orders” topic. The billing service reads “orders” using its own consumer group and writes to “invoices”. The analytics job reads both, but only in a group named for it. Each service has its own client identity and only those rules. If the analytics job is compromised, it cannot write fake orders.

i
Tip

Name principals after the service, not the team or person who created it. Service names stay stable when people change jobs, and they make audit logs easy to read.

13The Wider Ecosystem: Connect, Schema Registry, Brokers, and People

Kafka is rarely alone. Many other programs talk to it, and each one needs an identity. Here is how they all join the same token system.

Programs built on Kafka clients

Kafka Connect, Kafka Streams, ksqlDB, MirrorMaker, and most stream processors are built on the standard Kafka client library. So they pick up OAuth the same way any producer does: point them at the login handler, the token address, and the client ID and secret. Each should get its own client identity, not a shared one.

Kafka Connect deserves an extra note. A Connect cluster hosts many connectors, and each connector may need to reach a different topic. Many teams give each Connect cluster its own identity, and where the version supports it, use per-connector override settings to give sensitive connectors their own.

Broker-to-broker and controller traffic

Brokers copy data to each other and exchange cluster metadata. That traffic is authenticated too. You can use OAUTHBEARER for it, but many teams choose mutual TLS or SCRAM for the inside-the-cluster listener. The reason is availability: if inter-broker login depends on the identity provider, an identity provider outage during a token refresh could interrupt replication. Keeping the cluster’s own plumbing independent of an external service is a widely used safety choice.

Analogy

A hospital gives visitors passes from the front desk, but doctors moving between wards use their own internal badges that work even if the front desk computer is down. The inner circle should not depend on the outer service for its heartbeat.

Schema Registry, REST proxies, and gateways

Services that sit in front of Kafka, such as a schema registry or an HTTP gateway, often have their own front door with their own login method. They can accept OAuth tokens from users, then talk to Kafka using a service identity. Two patterns exist here. In the service-identity pattern, the gateway uses one identity for everything, and the gateway itself enforces who may do what. In the pass-through pattern, the gateway forwards the caller’s identity so Kafka sees the real caller. Pass-through gives better audit trails but is harder to build.

Where OIDC shines: people and dashboards

People do not run client credentials. They sign in through a browser. Tools such as web consoles for Kafka, topic browsers, and admin portals use the OIDC authorization code flow to identify the person. Look at the sign-in journey:

flowchart LR
  U["Engineer in Browser"] -->|"1 open console"| UI["Kafka Web Console"]
  UI -->|"2 redirect to login"| ID["OIDC Identity Provider"]
  U -->|"3 sign in with MFA"| ID
  ID -->|"4 authorization code"| UI
  UI -->|"5 exchange code for tokens"| ID
  ID -->|"6 ID token and access token"| UI
  UI -->|"7 connect with token or service identity"| K["Kafka Cluster"]
  K -->|"8 ACL check"| UI
    
Figure 4: A person signs in through OIDC. The console then reaches Kafka using an approved identity.

Steps 1 through 6 are pure OIDC. The console learns who the engineer is from the ID token, and it may see group memberships in the claims. Step 7 depends on the design. Either the console passes the person’s access token to Kafka so brokers can see the person, or the console uses its own identity and enforces its own rules about what each engineer may see. Both are legitimate. The first gives cleaner audit, the second gives simpler broker setup.

Example: a topic browser for support staff

A company lets support engineers peek at a small set of topics to debug customer issues. The web console signs them in through the company’s single sign-on with multi-factor checks. Group claims decide which topics each person can browse. Kafka itself only ever sees the console’s service identity, which has read-only rights on those topics. No support engineer ever holds a Kafka credential.

14Advanced Topics

Once the basics run smoothly, teams reach for these ideas to tighten security or handle bigger organizations.

1. Removing the client secret with workload identity

The one long-lived password in this design is the client secret. A newer approach replaces it with an identity handed to the workload by its platform. On Kubernetes, a running pod can receive a short-lived signed token about itself. Cloud platforms offer similar features. The application trades that platform token to the identity provider for a Kafka access token. Now there is no static password to leak, because every credential is minted on demand and expires quickly. Support for this pattern depends on your identity provider and Kafka release, so check what your versions allow.

Analogy

Instead of giving each employee a permanent office key they might lose, the building issues a temporary pass at the door each morning, based on the employee already being inside the company’s own trusted system.

2. Sender-constrained tokens

A bearer token works for whoever holds it. Sender-constrained tokens tie the token to something only the real client owns, such as a certificate or a private key. A thief who copies the token cannot use it, because they cannot prove they hold the matching secret. Standards such as certificate-bound tokens (RFC 8705) and DPoP (RFC 9449) do this. They are powerful, yet Kafka’s built-in support for them is limited today, so most teams reach the same goal by combining TLS, short lifetimes, and tight network rules.

3. Token exchange for gateways

Token exchange (RFC 8693) lets a service trade one token for another. Suppose a person calls a web service, and that service must read from Kafka on the person’s behalf. Instead of forwarding the person’s broad token, the service asks the identity provider for a narrower token that names both the person and the service, meant only for Kafka. That gives Kafka a true picture of who is acting, and limits the damage if that narrower token leaks.

4. More than one identity provider

Mergers, cloud migrations, and partners often mean two or more identity providers. The simplest Kafka approach is one issuer per listener: a listener for internal services trusting the company provider, another for partner traffic trusting theirs. Another approach is federation, where your main provider trusts the others and issues its own tokens. Libraries with multi-issuer validation exist but add complexity.

5. Custom extensions

The OAUTHBEARER message can carry optional key-value pairs called extensions. A client might send its tenant name or a deployment label. The broker’s validator or principal logic can read these. Never trust an extension for security decisions unless it is also backed by a signed claim, since clients control what they send.

6. Policy engines and richer authorizers

When simple ACLs stop being enough, teams plug in authorizers that consult a policy engine or read groups and roles from the token. Open-source options exist, including authorizers linked to Keycloak and to policy engines, and commercial platforms offer role-based access control. These make rules easier to reason about at scale, at the cost of another moving part on the critical path of every request.

7. Revocation strategies

Because signed tokens are checked locally, revocation lags. Practical strategies include short lifetimes, a maximum session time, a deny ACL for an emergency principal block, and, for the highest-risk cases, introspection-based validation where the provider is asked about each token. Choose based on how quickly a bad identity must lose access, and how much dependence on the provider you can accept.

i
Pick one at a time

Each advanced feature adds moving parts. Add them only in response to a real risk you can name, and add one at a time so you can tell what helped.

15Security Hardening

A token system is only as safe as its weakest habit. These are the places where real-world setups get hurt, and how to close each gap.

Threats and defenses

ThreatWhat happensDefense
Token sniffingSomeone on the network copies a token and replays itTLS on every listener; short lifetimes
Token leakage in logsA token appears in an error message or debug logScrub logs; never print authentication messages
Stolen client secretAttacker requests tokens as the serviceStore secrets in a secrets manager; rotate; alert on odd token requests
Token for another systemA token meant for a different API works on KafkaCheck the audience claim
Fake identity providerAttacker points a broker at a bad key listPin the exact issuer and key address; restrict allowed addresses
Unsigned tokens acceptedTest handler left enabledUse a real validator; audit configs
Never-ending sessionsOld connections outlive revoked identitiesEnable re-authentication with a maximum session time

Encryption is not optional

A bearer token is like cash: whoever holds it can spend it. TLS makes sure nobody can grab it on the network. Beyond turning TLS on, use modern versions, turn off obsolete ones, and make clients check the broker’s certificate name. Skipping the name check quietly removes protection against fake brokers that would happily collect tokens.

Protect the client secret

The client secret is the one long-lived password left in this design. It sits with each client. Keep it out of source code, container images, and shared chat. Load it from a secrets manager at startup, and rotate it on a schedule. Most providers allow two valid secrets at once, so rotation can happen without downtime. For extra strength, some identity providers let clients prove themselves with a signed assertion or a certificate instead of a shared secret, which removes the password entirely.

Validate more than the signature

A valid signature only proves that someone the provider trusted made the token. It does not prove the token is meant for Kafka. Turn on issuer and audience checks. Use a dedicated audience value for Kafka in the identity provider, so a token fetched for the payments API cannot be replayed against Kafka.

Analogy

A signed letter from the mayor proves the mayor wrote it. It does not prove the letter is addressed to you. A careful clerk checks both the seal and the address line.

Handle key rotation gracefully

Identity providers rotate signing keys regularly. During rotation, new tokens use a new key ID while older tokens still use the old one. The provider’s key list holds both for a while. Brokers must refresh their cached key list often enough to see new keys, and they must handle a token with an unknown key ID by re-fetching in a controlled way. If brokers cache keys too long, a rotation can make every new token look invalid at once, and the entire cluster rejects logins.

Guard the outbound calls

The login handler and validator both reach out to web addresses. If an attacker can change those settings, they may trick a component into contacting a malicious server or an internal-only address. Recent Kafka releases added protections that limit which addresses this code may call. Keep versions current, lock down who can edit broker and client settings, and use the allow-list features your version provides.

!
Watch out

Time matters. Tokens contain times, and servers compare them to their own clocks. Broker clocks that drift by minutes will reject good tokens or accept expired ones. Run reliable time synchronization on every host.

16Monitoring, Logging, Metrics, and Troubleshooting

If you cannot see logins failing, you will learn about it from angry teams. Watch these signals so you hear about problems first.

Metrics worth graphing

Broker

Authentication success and failure rate

Kafka exposes counters for successful and failed logins. A sudden rise in failures is your earliest warning of a key problem or a bad rollout.

Broker

Re-authentication counts and latency

Shows how many sessions are renewing and how long renewals take. Failures here mean clients will be dropped soon.

Client

Connection churn

Many new connections per minute can mean sessions are ending too early or tokens are expiring faster than clients refresh.

Identity provider

Token request rate and errors

Watch latency and error rate on the token endpoint. Refresh storms show up here first.

Broker

Authorization denials

Denied requests point to missing ACLs or misconfigured principals.

Host

Clock offset

Drifting clocks cause confusing token errors. Alert on offset before it hurts.

What to log, and what never to log

Log the principal name, the client address, the outcome, and a short reason for every failed login: expired token, bad signature, unknown key, wrong audience, and so on. Enable authorizer logging so denied requests show which principal asked for what. Never log the token itself or the client secret. Logs are copied widely, and a token in a log is a token in the wrong hands.

Troubleshooting by symptom

SymptomLikely causeFirst thing to check
All new logins fail at onceKey rotation not picked up, or provider outageBroker logs for unknown key ID; can the broker reach the key address?
One client fails, others fineWrong secret, expired secret, or wrong audienceThe token request response from the identity provider
Failures start after a while on healthy clientsRefresh failing, so sessions endClient logs for refresh errors; provider rate limits
Token accepted but requests deniedPrincipal name does not match ACLsWhich claim becomes the principal; exact spelling
Token rejected as not yet validClock differencesTime sync on brokers and client hosts
Unsupported mechanism errorListener missing OAUTHBEAREREnabled mechanisms on that listener
Client disconnects on scheduleRe-authentication not supported or failingClient version; maximum session time setting

Failure scenarios and recovery

Identity provider outage

Existing sessions keep working until they need to renew. New logins and refreshes fail. Mitigation: run the identity provider highly available, use token lifetimes long enough to ride out short outages, and make clients retry with backoff instead of crashing. Broker key caches keep working, since keys were fetched earlier.

Bad key rotation

New tokens are signed with a key the brokers do not know. Every new login fails. Mitigation: publish the new key before signing with it, keep the old key listed until all old tokens expire, and shorten the broker refresh interval during planned rotations.

Leaked client secret

Disable the client at the identity provider, and existing tokens die at their expiry. To cut off faster, set a short lifetime and a maximum session time so the broker drops the connection soon after. Issue a new secret, and deploy it.

17Operating It Day to Day: Ownership and Runbooks

A secure system that nobody knows how to fix at 3 a.m. is not secure for long. This chapter is about people and procedures.

Who owns what

Three groups touch this setup, and problems drag on when nobody knows which group owns which piece. The identity team owns the provider: the token endpoint, key rotation, client registration, and secret policies. The Kafka platform team owns the brokers: listener settings, the validator, ACLs, and session limits. The application teams own their clients: using the shared library, storing secrets correctly, and handling errors. Write these boundaries down, and add a shared contact route for issues that cross them.

Analogy

In an airport, the passport office issues documents, the airline checks boarding passes, and the passenger keeps their papers safe. If a passenger is stopped at the gate, everyone needs to know which desk to walk to. Confusion about ownership is what turns a five-minute fix into a five-hour delay.

Runbooks worth writing

Runbook

Onboard a new application

Steps to register a client, generate its secret into the secrets manager, create ACLs, and confirm a test login.

Runbook

Rotate a client secret

Add the second secret, roll the application, confirm the new one is in use, then retire the old one.

Runbook

Rotate signing keys

Publish the new key, wait for broker caches to refresh, switch signing, and keep the old key listed until old tokens expire.

Runbook

Respond to a leaked secret

Disable the client, shorten sessions if needed, issue a new secret, review audit logs for misuse.

Runbook

Login failures spike

Decision tree: check the provider, then key cache, then clocks, then recent config changes.

Runbook

Provider outage

What runs on, what fails, who to page, and when to extend token lifetimes as a temporary measure.

Alert design

Good alerts point to an action. “Login failures are above normal for five minutes” is better than “error count high”. Tie each alert to the matching runbook, and route it to the right team. Include a slow-burn alert for things that creep up, such as client secrets close to their expiry date, signing keys close to their end of life, and certificates about to expire. These quiet expirations cause many of the loudest outages.

Documentation for application teams

Application developers should not need to understand every detail of OAuth. Give them a short page with the exact library or settings template to use, how to request a new identity, what the common errors mean, and where to ask for help. The simpler the path, the less likely someone invents a risky shortcut.

i
Practice the drill

Once a quarter, run a game day. Rotate a key, kill a provider node, or expire a secret on purpose in a safe environment. The team that has done it once handles the real thing calmly.

18Deployment and Migration

A clear checklist of what must be set on each side, and a safe path from your current login method to OAuth without breaking anyone.

What the broker needs to know

1

A secure listener

A listener using SASL over TLS, with valid certificates and a name clients can verify.

2

The mechanism switched on

OAUTHBEARER added to the list of enabled mechanisms for that listener.

3

The validator

The validator handler chosen, plus the address of the public key list.

4

Expected issuer and audience

The exact values every token must carry.

5

The principal claim

Which claim becomes the Kafka username, if not the default.

6

Session limits

Maximum session time so re-authentication is enforced.

What each client needs to know

A client needs to know the security protocol (SASL over TLS), the mechanism name, the login handler, the token endpoint address, its client ID and secret, and optionally a scope value. It also needs a truststore so it can verify the broker’s certificate. Most teams wrap these into a shared internal library or template, so application developers only supply an application name and let the platform fill in the rest.

Environments

Give development, staging, and production their own identity provider tenants or realms, or at least their own clients and audiences. Nothing gained in a test environment should work in production. Use different secrets in each, and a different audience value, so a token that leaks from testing cannot open the real cluster.

Migration: moving from an existing login method

Kafka lets one listener enable several mechanisms at once, and each client picks one during the handshake. That makes gradual migration possible without a big-bang cutover.

1

Prepare the identity provider

Create clients for each application, set audiences, and decide token lifetimes.

2

Add OAUTHBEARER alongside the old mechanism

Roll it out one broker at a time so the cluster stays available. Old clients keep working.

3

Mirror the ACLs

The new principal names usually differ from the old usernames. Add matching rules for the new names before moving anyone.

4

Move one low-risk application

Watch it across several token refreshes and at least one full session renewal.

5

Move the rest in waves

Track the list of clients still using the old method through logs and metrics.

6

Retire the old mechanism

Remove it and its ACLs once no client uses it. Keep a rollback plan for a few days.

Kubernetes considerations

On Kubernetes, client secrets belong in the platform’s secret store, mounted or injected into pods. Broker certificates are commonly issued and renewed by an automated certificate manager. When brokers restart, rolling them one at a time keeps clients connected, but expect a short wave of reconnect logins, which is why the jitter and backoff ideas matter. Operators such as Strimzi can describe the whole OAuth setup declaratively, which keeps environments consistent.

!
Rollback plan

Always be able to return to the previous state in minutes. Keep the old mechanism enabled until the very end, and keep the old ACLs until you are sure nobody depends on them.

19A Worked Example: Onboarding a Payments Service

Let us walk through a complete, realistic story from request to first message, tying together everything so far. The company and names are made up for illustration.

A company called Northwind runs a Kafka cluster shared by many teams. The payments team is building a service named “payments-ledger”. It must read approved orders from a topic called “orders.approved” and write completed entries to “ledger.entries”. Here is how the platform team brings it on.

1

The request

The payments team files an onboarding request naming the service, the two topics, the actions needed (read one, write one), and the consumer group name they plan to use.

2

Register the identity

The identity team creates a client called “payments-ledger” in the provider. It is set to use the client credentials grant, and its tokens carry the audience value reserved for Kafka. The token lifetime follows the company standard of ten minutes.

3

Place the secret

The generated client secret goes straight into the secrets manager, in a path that only the payments-ledger workload may read. Nobody copies it into a chat message or a ticket.

4

Write the access rules

The platform team adds rules for the principal “payments-ledger”: permission to read the “orders.approved” topic, permission to use a consumer group with an agreed name, and permission to write the “ledger.entries” topic. Nothing else. The rules are committed to the access-rules repository, reviewed by a second engineer, and applied by automation.

5

Configure the client

The service uses the company’s shared Kafka client template. The developers supply only the application name. The template fills in the secure protocol, the OAUTHBEARER mechanism, the token endpoint, and pulls the secret at start-up.

6

First run in staging

In staging, the service starts, fetches a token, connects, and begins reading. The team confirms in the dashboards that the login succeeded and that the principal name is correct.

7

Test beyond the first expiry

They leave the service running past several token lifetimes. Logs show the token being refreshed at roughly eight minutes each time, and re-authentication counters go up without any disconnections.

8

Try the forbidden thing

As a safety test, they deliberately try to write to “orders.approved”. Kafka refuses with an authorization error. The rules are working exactly as designed.

9

Go to production

The production client has a different secret and audience from staging. The rollout goes one instance at a time, and the on-call engineer watches login failures and refresh errors for the first hour.

What went wrong along the way

Real stories have bumps. In this one, the first staging run failed with a “wrong audience” error. The identity team had set the audience to the production value by mistake, so the broker’s check rejected the token. Because audience checks were on, the mistake was caught immediately in staging and cost five minutes. Had the checks been turned off “to make it work”, the error would have hidden itself until the wrong token was used somewhere it should not have been.

A second bump came a week later. A developer added a second consumer group name to the code without telling the platform team. The service failed to join the new group, with an authorization error that named the group. Because authorizer logging was on, the fix took a single review comment and one new rule.

What this story shows

Lesson

Automation removes mistakes

Secrets in a manager, rules in version control, and a shared client template leave little room for improvisation.

Lesson

Strict checks catch errors early

Audience and issuer validation turned a silent misconfiguration into a loud, cheap failure.

Lesson

Test past the first hour

Watching a refresh and a re-authentication before production removes the most common surprise.

Lesson

Least privilege is easy when it starts small

Two read/write permissions and one group are simple to review. Wide rules are hard to shrink later.

20Testing and Validation Strategy

Most OAuth trouble appears only after the first token expires or the first key rotates. Test those moments on purpose.

A lab environment with a real identity server, running in containers on a laptop or in a build pipeline, is well worth the effort. It lets you try every failure without touching production. The tests below cover the situations that catch most teams out.

TestWhat you doWhat you expect
Happy pathProduce and consume with a fresh tokenMessages flow; principal shows the right name
Expired tokenPresent a token past its expiryLogin refused with a clear reason
Wrong audienceUse a token meant for another systemLogin refused
Wrong issuerUse a token from a different providerLogin refused
Bad signatureAlter one character of a valid tokenLogin refused
Unknown keySign with a key not in the key listRefused; broker handles re-fetch safely
Clock skewMove a test host clock a few minutesFailures appear; alerts fire
Long sessionRun a client past several token lifetimesRefresh and re-authentication succeed silently
Provider downStop the identity server mid-runExisting sessions live until renewal; retries back off
Key rotationRotate keys while clients runNo login failures
ACL denialAttempt a write without permissionAuthorization error, not a login error
Load burstStart thousands of clients at onceProvider and brokers stay healthy

Keep the tests running

Put the fast tests in your build pipeline, so an upgrade to Kafka, the identity provider, or a client library is checked automatically. Run the slow ones, such as long sessions and load bursts, on a schedule. A common surprise is a library upgrade that silently changes default settings, such as the refresh window or the allowed web addresses, so the test suite is your safety net.

Example: the Friday key rotation

A team rotates signing keys every quarter. Their test pipeline includes a scenario that rotates keys while clients are running. One quarter, a broker upgrade changed how often keys were refreshed. The scenario failed in staging, the team adjusted the refresh interval, and production rotated cleanly the following week. Without the test, the first sign would have been a cluster full of rejected logins.

21Advantages, Disadvantages, and Trade-offs

No design is free. An honest view of the trade-offs lets you choose with open eyes.

Advantages

  • One central identity system for people, services, and Kafka
  • Short-lived credentials shrink the damage of leaks
  • Brokers hold only public keys, never client passwords
  • Offboarding and policy changes happen in one place
  • Works with standard identity products your company likely already owns
  • Token checks are fast local math, so throughput is unaffected
  • Pairs naturally with single sign-on for human tools

Disadvantages

  • The identity provider becomes a critical dependency for logins and refreshes
  • Default ACLs ignore scopes and groups, so extra design work is needed
  • Clients must get refresh and re-authentication right
  • Debugging spans three systems: client, provider, and broker
  • Client secrets still exist and must be guarded
  • Older clients may lack full support
  • Revocation is not instant, because tokens live until they expire

OAuth compared with the other options

OptionBest whenMain weakness
OAUTHBEARERYou have an identity provider and many services; you want central controlDepends on the provider; needs authorization design
SCRAMSmall setup, few clients, no identity systemCredentials stored and managed in the cluster
mTLSStrong machine identity, existing certificate authorityCertificate issuing and renewal at scale
KerberosExisting Kerberos estateComplex to run; dated tooling
PLAIN with external checkSimple bridge to another systemSends secrets to broker; needs TLS at all times

The core trade-offs

Trade-off

Short versus long token life

Short is safer but adds refresh traffic and more chances to fail. Long is calmer but slower to revoke.

Trade-off

Local check versus introspection

Checking signatures locally is fast and resilient. Asking the provider about each token gives instant revocation but adds load and a dependency.

Trade-off

Shared versus per-app identity

Shared is easier to set up. Per-app gives clean audit and least privilege.

Trade-off

Built-in versus library

Built-in means fewer parts. A library may give more features at the price of one more dependency.

22Design Patterns and Anti-Patterns

Proven shapes that work, and common shapes that look fine until they fail.

Patterns worth copying

Pattern

Identity per application

Every service gets its own client at the identity provider and its own ACLs. Audit trails become obvious.

Pattern

Dedicated Kafka audience

Tokens meant for Kafka carry an audience naming Kafka. Brokers reject everything else.

Pattern

Separate listeners by purpose

One listener for clients using OAuth, another for inter-broker traffic using an independent mechanism.

Pattern

Secrets from a manager

Client secrets are pulled at start-up from a secrets manager and rotated on a schedule.

Pattern

ACLs as code

Access rules live in version control and are applied by automation, so every change is reviewed.

Pattern

Gateway for humans

People use OIDC single sign-on into a console. The console holds the Kafka identity and enforces per-person rules.

Anti-patterns to avoid

ANTI-PATTERN 01Avoid
What it looks like

One client identity shared by every team and application, “to keep things simple”.

Why it hurts

You lose the ability to tell who did what. Any leak exposes everything. You cannot apply least privilege because the one identity needs the union of all rights.

Better approach

Create one identity per application and generate its ACLs from a reviewed list.

ANTI-PATTERN 02Avoid
What it looks like

Assuming scopes in the token automatically restrict what a client can do inside Kafka.

Why it hurts

The default authorizer ignores scopes. A “read-only” token may still write if ACLs allow the principal to write.

Better approach

Encode real permissions in ACLs or in an authorizer that explicitly reads scopes, and test with a denied write.

ANTI-PATTERN 03Avoid
What it looks like

Tokens with multi-day or never-expiring lifetimes, because refresh was “annoying”.

Why it hurts

This turns a bearer token back into a long-lived password with all the old problems.

Better approach

Keep lifetimes short. Fix the refresh code instead of stretching the timer.

ANTI-PATTERN 04Avoid
What it looks like

Sending an ID token to Kafka instead of an access token.

Why it hurts

The ID token is meant for the client to read about the person. Its audience is the client app, not Kafka, so proper audience checks reject it or, worse, get switched off to make it work.

Better approach

Send access tokens to Kafka. Use ID tokens only inside the login-facing application.

ANTI-PATTERN 05Avoid
What it looks like

Leaving the test “unsecured” OAuth handler in place after a proof of concept.

Why it hurts

It accepts anything that looks like a token. The cluster is effectively open.

Better approach

Add a startup check or config review that fails loudly if the test handler appears anywhere outside a lab.

23Best Practices and Common Mistakes

A practical checklist you can walk through before going live, followed by the mistakes that trip up most first attempts.

Before you go live

1

Encrypt everything

Use SASL over TLS on every client and inter-broker listener. Verify certificate names.

2

Register one client per application

Give each a clear name, a dedicated audience, and only the scopes it needs.

3

Validate fully

Configure issuer and audience checks, correct key address, and clock tolerance.

4

Enable re-authentication

Set a maximum session time and upgrade clients first. Test what happens when a token expires mid-session.

5

Write ACLs by principal

Start from deny-all. Add only what each service needs. Store the rules in version control.

6

Rehearse failures

Practice a provider outage, a key rotation, and a leaked secret in a test environment.

7

Wire up monitoring

Graph login failures, re-authentication, and token endpoint errors. Alert before users complain.

Common mistakes

Mistake

Skipping the audience check

Any signed token from the same provider passes, even ones meant for other APIs.

Mistake

Testing only the happy path

Everything works for the first hour. Trouble arrives at the first expiry, so test past it.

Mistake

Mixed-up principal names

The subject claim is an unreadable ID, but ACLs were written using a friendly name. Every request is denied.

Mistake

Forgetting clock sync

Tokens look expired or not yet valid on drifting hosts.

Mistake

One giant refresh storm

Thousands of clients refresh at the same second after a restart. Use jitter, and stagger rollouts.

Mistake

Making brokers depend on the provider for replication

An identity outage then stalls internal traffic. Keep the inner circle independent.

i
Rollout tip

Migrate gradually. Add an OAuth listener beside your current one, move one low-risk application, watch it through several token expiries, then move the rest. Only after every client is moved should you close the old listener.

24Real-World Usage Patterns

How teams typically shape this in practice. These are common patterns seen across the industry, described in general terms rather than as claims about any one company’s private setup.

Kafka on Kubernetes with an open-source identity server

A very common setup pairs Kafka running on Kubernetes, often managed by the Strimzi operator, with Keycloak as the identity provider. Each application has a client in Keycloak. The Kafka custom resource lists the listener with OAuth turned on, the issuer address, and the key address. Applications running as pods fetch a token at start-up and refresh it in the background. Teams like this pattern because the whole thing can be described as configuration files kept in version control.

Analogy

It is like a co-working space where the front desk (Keycloak) prints badges and every room’s door reader (Kafka brokers) is set up from one shared rulebook. Change the rulebook, and every door follows.

Enterprise single sign-on with a commercial provider

Large companies often already run Okta, Microsoft Entra ID, or a similar product for employees. They extend it to service identities. Kafka platform teams create app registrations for services, use the provider’s audit tools to see token issuance, and connect the same provider to human-facing Kafka consoles. The advantage is that security teams, who already understand this product, can apply their existing policies, reviews, and monitoring to Kafka access without learning a new system.

Managed Kafka services with identity pools

Some managed Kafka platforms, including Confluent Cloud, let you plug in your own OIDC identity provider. Instead of creating an API key for every application, you map incoming tokens to identities through rules, sometimes grouped as identity pools. Other managed services offer cloud-native login of their own. In both cases the ideas from this guide still apply: tokens, short life, audience, and least-privilege rules.

Multi-tenant platforms

A central platform team may run one large Kafka cluster shared by dozens of product teams. Each team gets its own client identities and a naming convention for topics, for example a team name prefix. ACLs are written with prefix rules so a team can manage only its own area. The identity provider’s groups map to teams. A change request to add a new team becomes: create identities, add a prefix rule, done.

Pattern: the platform onboarding pipeline

A team files a request that lists their applications, topics, and needed actions. Automation creates the clients in the identity provider, generates the secrets into a secrets manager, applies the ACLs, and posts the connection details back. A human only reviews the request. The result is consistent, auditable, and fast.

Cross-cluster replication

When data flows between clusters, for example from a regional cluster to a central analytics cluster, the replicator program is just another client. It gets its own identity in each cluster, with read access on the source side and write access on the destination side. Because each cluster may trust a different identity provider, replication tools that support separate settings per cluster are important.

What large-scale operators teach us

Companies that run Kafka at very high scale, such as LinkedIn, Netflix, and Uber, share a few lessons that carry over to any size. They centralize identity, automate access changes, treat Kafka as a shared platform with many tenants, and invest heavily in monitoring. When you run thousands of producers and consumers, manual credential handling stops working, and short-lived, automatically refreshed credentials become the only sane choice.

Per-app
identities, so audit and least privilege work
Automated
onboarding and ACL changes from reviewed code
Observed
login failures and refresh errors on dashboards

25Quick Glossary

Every important word from this guide in one place, for quick lookup.

TermPlain meaning
Access tokenThe pass presented to a protected system to prove permission
ACLA rule saying which principal may do which action on which resource
Audience (aud)The system a token is meant for
AuthenticationProving who you are
AuthorizationDeciding what a proven identity may do
Authorization serverThe service that issues tokens; the identity provider
Bearer tokenA token that works for whoever holds it
BrokerA Kafka server that stores and serves events
Callback handlerA plug-in piece of code that does the login or validation work
Client credentialsA grant type where a program gets a token using its own ID and secret
Discovery documentA public page listing a provider’s endpoints and settings
ExtensionOptional key-value data sent with the login message
Grant typeThe method used to obtain a token
ID tokenA signed statement of who signed in, meant for the client app
IntrospectionAsking the provider whether a token is valid
Issuer (iss)The system that created the token
JWKSA published list of public keys used to check signatures
JWTA signed token with readable facts inside
ListenerA network address and port on a broker with a chosen security style
OAUTHBEARERThe SASL mechanism that carries OAuth tokens
OIDCAn identity layer on top of OAuth 2.0
PrincipalThe name Kafka uses for an authenticated client
Re-authenticationLogging in again on an open connection with a fresh token
SASLA frame that lets a client and server agree on a login method
ScopeA label naming a slice of permission
Subject (sub)Who the token is about
TLSEncryption that protects data traveling over the network

26Frequently Asked Questions

Short, direct answers to the questions people ask most often.

Q1Does Kafka support OpenID Connect directly?
Kafka brokers understand OAuth access tokens through the OAUTHBEARER mechanism. OIDC helps by standardizing the identity provider, its discovery document, and token claims. Human sign-in screens are the job of the tools around Kafka, not the broker.
Q2Which OAuth grant type should Kafka clients use?
Client credentials is the standard choice for programs that run without a person. Web consoles for people use the authorization code flow inside the console itself.
Q3Must the token be a JWT?
Kafka’s built-in validator expects a JWT it can check with public keys. If your provider issues opaque tokens, use a library that supports introspection, which asks the provider about each token.
Q4What becomes the Kafka username?
By default, the subject claim of the token. You can configure a different claim, or write a custom principal builder to shape the name.
Q5Do scopes control what a client can do in Kafka?
Not with the default authorizer. It matches ACLs to the principal name only. Use per-role identities, a custom principal builder, or a scope-aware authorizer.
Q6What happens when the token expires while connected?
If re-authentication is enabled, the client presents a fresh token on the same connection before the session ends. If it fails to do so, the broker closes the connection. Without re-authentication, the broker checks only at connect time.
Q7Do brokers call the identity provider for each message?
No. With signed JWTs, brokers fetch public keys on a timer and verify locally. Message traffic does not touch the provider.
Q8Is TLS still needed if the token is signed?
Yes. A signature stops forgery, not copying. Without encryption, anyone on the network can steal a valid token and reuse it until it expires.
Q9Can I use OAuth for broker-to-broker traffic?
You can, but many teams prefer an independent method such as mutual TLS for the inside of the cluster, so replication does not depend on an external service.
Q10How do I revoke a client quickly?
Disable the client at the identity provider so no new tokens are issued, and keep token lifetimes and the maximum session time short so existing sessions end soon. Instant cut-off needs introspection or a deny ACL on the principal.
Q11What is the difference between an ID token and an access token?
The ID token tells the client application who signed in. The access token is what you present to a protected system such as Kafka. Send the access token to Kafka.
Q12Do old Kafka clients work with OAuth?
The mechanism has existed since Kafka 2.0, but full re-authentication needs newer clients and brokers, and the built-in production handlers arrived in 3.1. Check the versions of every client before enforcing.
Q13Where does the client secret live?
In a secrets manager, injected into the application at start-up. Never in source code or container images.
Q14Why do all my clients fail right after a key rotation?
Brokers probably cached the old key list and cannot find the new key ID. Publish new keys ahead of use and refresh broker caches on a shorter interval during rotations.
Q15Is this better than SCRAM or mTLS?
It depends on your world. If you already run an identity provider and have many services, OAuth centralizes control. For a small cluster with few clients, SCRAM or mTLS can be simpler.

27Summary and Key Takeaways

You now have the complete picture, from the first token request to the last denied write.

Kafka by default trusts everybody. OAuth 2.0 and OpenID Connect let you hand the question of “who is this?” to an identity provider your company already trusts. Clients collect short-lived signed tokens, Kafka brokers check the signatures with public keys, and ACLs decide what each named client may do. Each part has a clear job, and none of them needs to know the client’s password.

A token proves who is knocking. An ACL decides which doors open. Good security needs both.

Key Takeaways

  • Use OAUTHBEARER over TLS. Kafka carries OAuth access tokens through SASL, and encryption is what keeps those tokens from being copied.
  • Machines use client credentials, people use OIDC login. Send access tokens to Kafka, and keep ID tokens inside the sign-in application.
  • Validate more than the signature. Check issuer, audience, and expiry, and keep clocks in sync.
  • Turn on re-authentication. It makes token expiry a real limit on long-lived connections, and clients should refresh early with jitter.
  • Close the scope gap. Default ACLs match the principal name only, so design per-app identities, a custom principal builder, or a scope-aware authorizer.
  • Give every application its own identity and apply least privilege through reviewed, version-controlled rules.
  • Monitor logins and rehearse failures such as provider outages, key rotation, and leaked secrets before they happen for real.