This is an automated email from the ASF dual-hosted git repository.
manikumar pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new 52a3fa07446 KAFKA-15878: KIP-768 - Extend support for opaque (i.e.
non-JWT) tokens in SASL/OAUTHBEARER (#14818)
52a3fa07446 is described below
commit 52a3fa07446f9c108399d47dbfb1685989a5d6eb
Author: Jamie <[email protected]>
AuthorDate: Sat Mar 2 08:13:56 2024 +1300
KAFKA-15878: KIP-768 - Extend support for opaque (i.e. non-JWT) tokens in
SASL/OAUTHBEARER (#14818)
# Overview
* This change pertains to [SASL/OAUTHBEARER
](https://kafka.apache.org/documentation/#security_sasl_oauthbearer) mechanism
of Kafka authentication.
* Kafka clients can use [SASL/OAUTHBEARER
](https://kafka.apache.org/documentation/#security_sasl_oauthbearer)
mechanism by overriding the [custom call back
handlers](https://kafka.apache.org/documentation/#security_sasl_oauthbearer_prod)
.
*
[KIP-768](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=186877575)
available from v3.1 further extends the mechanism with a production grade
implementation.
* Kafka's [SASL/OAUTHBEARER
](https://kafka.apache.org/documentation/#security_sasl_oauthbearer) mechanism
currently **rejects the non-JWT (i.e. opaque) tokens**. This is because of a
more restrictive set of characters than what
[RFC-6750](https://datatracker.ietf.org/doc/html/rfc6750#section-2.1)
recommends.
* This JIRA can be considered an extension of
[KIP-768](https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=186877575)
to support the opaque tokens as well apart from the JWT tokens.
# Solution
* Have updated the regex in the the offending class to be compliant with
the [RFC-6750](https://datatracker.ietf.org/doc/html/rfc6750#section-2.1)
* Have provided a supporting test case that includes the possible character
set defined in
[RFC-6750](https://datatracker.ietf.org/doc/html/rfc6750#section-2.1)
---------
Co-authored-by: Anuj Sharma <[email protected]>
Co-authored-by: Jamie Holmes <[email protected]>
Co-authored-by: Christopher Webb <[email protected]>
Reviewers: Manikumar Reddy <[email protected]>, Kirk True
<[email protected]>
---
.../internals/OAuthBearerClientInitialResponse.java | 2 +-
.../internals/OAuthBearerClientInitialResponseTest.java | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
diff --git
a/clients/src/main/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponse.java
b/clients/src/main/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponse.java
index 73bfcd15c12..3b340131cf8 100644
---
a/clients/src/main/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponse.java
+++
b/clients/src/main/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponse.java
@@ -34,7 +34,7 @@ public class OAuthBearerClientInitialResponse {
private static final String VALUE = "[\\x21-\\x7E \t\r\n]+";
private static final String KVPAIRS = String.format("(%s=%s%s)*", KEY,
VALUE, SEPARATOR);
- private static final Pattern AUTH_PATTERN =
Pattern.compile("(?<scheme>[\\w]+)[ ]+(?<token>[-_\\.a-zA-Z0-9]+)");
+ private static final Pattern AUTH_PATTERN =
Pattern.compile("(?<scheme>[\\w]+)[ ]+(?<token>[-_~+/\\.a-zA-Z0-9]+([=]*))");
private static final Pattern CLIENT_INITIAL_RESPONSE_PATTERN =
Pattern.compile(
String.format("n,(a=(?<authzid>%s))?,%s(?<kvpairs>%s)%s",
SASLNAME, SEPARATOR, KVPAIRS, SEPARATOR));
public static final String AUTH_KEY = "auth";
diff --git
a/clients/src/test/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponseTest.java
b/clients/src/test/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponseTest.java
index 3b3c90bf1d2..fc44297a2f3 100644
---
a/clients/src/test/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponseTest.java
+++
b/clients/src/test/java/org/apache/kafka/common/security/oauthbearer/internals/OAuthBearerClientInitialResponseTest.java
@@ -102,6 +102,18 @@ public class OAuthBearerClientInitialResponseTest {
assertEquals("143", response.extensions().map().get("port"));
}
+ // RFC 6750 token format 1*( ALPHA / DIGIT /"-" / "." / "_" / "~" / "+" /
"/" ) *"="
+ @Test
+ public void testCharSupportForRfc6750Token() throws Exception {
+ String message =
"n,[email protected],\u0001host=server.example.com\u0001port=143\u0001" +
+ "auth=Bearer
vF-9.df_t4qm~Tc2Nvb3RlckBhbHR+hdmlzdGEuY29/tCg==\u0001\u0001";
+ OAuthBearerClientInitialResponse response = new
OAuthBearerClientInitialResponse(message.getBytes(StandardCharsets.UTF_8));
+ assertEquals("vF-9.df_t4qm~Tc2Nvb3RlckBhbHR+hdmlzdGEuY29/tCg==",
response.tokenValue());
+ assertEquals("[email protected]", response.authorizationId());
+ assertEquals("server.example.com",
response.extensions().map().get("host"));
+ assertEquals("143", response.extensions().map().get("port"));
+ }
+
@Test
public void testNoExtensionsFromByteArray() throws Exception {
String message = "n,[email protected],\u0001" +