Skip to content

Commit a2a8e10

Browse files
committed
Addressing review comments from @tishun
1 parent 8c760f1 commit a2a8e10

File tree

5 files changed

+38
-30
lines changed

5 files changed

+38
-30
lines changed

src/main/java/io/lettuce/authx/TokenBasedRedisCredentialsProvider.java

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
import io.lettuce.core.RedisCredentials;
1010
import io.lettuce.core.RedisCredentialsProvider;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
1113
import reactor.core.publisher.Flux;
1214
import reactor.core.publisher.Mono;
1315
import reactor.core.publisher.Sinks;
@@ -18,42 +20,31 @@
1820

1921
public class TokenBasedRedisCredentialsProvider implements RedisCredentialsProvider, AutoCloseable {
2022

23+
private static final Logger log = LoggerFactory.getLogger(TokenBasedRedisCredentialsProvider.class);
24+
2125
private final TokenManager tokenManager;
2226

2327
private final Sinks.Many<RedisCredentials> credentialsSink = Sinks.many().replay().latest();
2428

25-
public TokenBasedRedisCredentialsProvider(TokenAuthConfig tokenAuthConfig) {
26-
this(new TokenManager(tokenAuthConfig.getIdentityProviderConfig().getProvider(),
27-
tokenAuthConfig.getTokenManagerConfig()));
28-
29-
}
30-
31-
public TokenBasedRedisCredentialsProvider(TokenManager tokenManager) {
29+
private TokenBasedRedisCredentialsProvider(TokenManager tokenManager) {
3230
this.tokenManager = tokenManager;
33-
initializeTokenManager();
3431
}
3532

36-
/**
37-
* Initialize the TokenManager and subscribe to token renewal events.
38-
*/
39-
private void initializeTokenManager() {
33+
private void init() {
34+
4035
TokenListener listener = new TokenListener() {
4136

4237
@Override
4338
public void onTokenRenewed(Token token) {
44-
try {
45-
String username = token.getUser();
46-
char[] pass = token.getValue().toCharArray();
47-
RedisCredentials credentials = RedisCredentials.just(username, pass);
48-
credentialsSink.tryEmitNext(credentials);
49-
} catch (Exception e) {
50-
credentialsSink.emitError(e, Sinks.EmitFailureHandler.FAIL_FAST);
51-
}
39+
String username = token.getUser();
40+
char[] pass = token.getValue().toCharArray();
41+
RedisCredentials credentials = RedisCredentials.just(username, pass);
42+
credentialsSink.tryEmitNext(credentials);
5243
}
5344

5445
@Override
5546
public void onError(Exception exception) {
56-
credentialsSink.tryEmitError(exception);
47+
log.error("Token renew failed!", exception);
5748
}
5849

5950
};
@@ -62,6 +53,8 @@ public void onError(Exception exception) {
6253
tokenManager.start(listener, false);
6354
} catch (Exception e) {
6455
credentialsSink.tryEmitError(e);
56+
tokenManager.stop();
57+
throw new RuntimeException("Failed to start TokenManager", e);
6558
}
6659
}
6760

@@ -111,4 +104,15 @@ public void close() {
111104
tokenManager.stop();
112105
}
113106

107+
public static TokenBasedRedisCredentialsProvider create(TokenAuthConfig tokenAuthConfig) {
108+
return create(new TokenManager(tokenAuthConfig.getIdentityProviderConfig().getProvider(),
109+
tokenAuthConfig.getTokenManagerConfig()));
110+
}
111+
112+
public static TokenBasedRedisCredentialsProvider create(TokenManager tokenManager) {
113+
TokenBasedRedisCredentialsProvider credentialManager = new TokenBasedRedisCredentialsProvider(tokenManager);
114+
credentialManager.init();
115+
return credentialManager;
116+
}
117+
114118
}

src/test/java/io/lettuce/authx/EntraIdIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static void setup() {
5858
.secret(testCtx.getClientSecret()).authority(testCtx.getAuthority()).scopes(testCtx.getRedisScopes())
5959
.expirationRefreshRatio(0.0000001F).build();
6060

61-
credentialsProvider = new TokenBasedRedisCredentialsProvider(tokenAuthConfig);
61+
credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenAuthConfig);
6262

6363
RedisURI uri = RedisURI.builder().withHost(testCtx.host()).withPort(testCtx.port())
6464
.withAuthentication(credentialsProvider).build();

src/test/java/io/lettuce/authx/TokenBasedRedisCredentialsProviderTest.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class TokenBasedRedisCredentialsProviderTest {
2525
public void setUp() {
2626
// Use TestToken manager to emit tokens/errors on request
2727
tokenManager = new TestTokenManager(null, null);
28-
credentialsProvider = new TokenBasedRedisCredentialsProvider(tokenManager);
28+
credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenManager);
2929
}
3030

3131
@Test
@@ -128,13 +128,17 @@ public void shouldPropagateMultipleTokensOnStream() {
128128
@Test
129129
public void shouldHandleTokenRequestErrorGracefully() {
130130
Exception simulatedError = new RuntimeException("Token request failed");
131-
tokenManager.emitError(simulatedError);
132131

133132
Flux<RedisCredentials> result = credentialsProvider.credentials();
134133

135-
StepVerifier.create(result).expectErrorMatches(
136-
throwable -> throwable instanceof RuntimeException && "Token request failed".equals(throwable.getMessage()))
137-
.verify();
134+
StepVerifier.create(result).then(() -> {
135+
tokenManager.emitToken(testToken("test-user", "token1"));
136+
tokenManager.emitError(simulatedError);
137+
tokenManager.emitToken(testToken("test-user", "token2"));
138+
}).assertNext(credentials -> assertThat(String.valueOf(credentials.getPassword())).isEqualTo("token1"))
139+
.assertNext(credentials -> assertThat(String.valueOf(credentials.getPassword())).isEqualTo("token2"))
140+
.thenCancel().verify(Duration.ofMillis(100));
141+
138142
}
139143

140144
private SimpleToken testToken(String username, String value) {

src/test/java/io/lettuce/core/AuthenticationIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ void tokenBasedCredentialProvider(RedisClient client) {
135135
.reauthenticateBehavior(ClientOptions.ReauthenticateBehavior.ON_NEW_CREDENTIALS).build());
136136

137137
TestTokenManager tokenManager = new TestTokenManager(null, null);
138-
TokenBasedRedisCredentialsProvider credentialsProvider = new TokenBasedRedisCredentialsProvider(tokenManager);
138+
TokenBasedRedisCredentialsProvider credentialsProvider = TokenBasedRedisCredentialsProvider.create(tokenManager);
139139

140140
// Build RedisURI with streaming credentials provider
141141
RedisURI uri = RedisURI.builder().withHost(TestSettings.host()).withPort(TestSettings.port())

src/test/java/io/lettuce/examples/TokenBasedAuthExample.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static void main(String[] args) throws Exception {
4747
TokenAuthConfig tokenAuthConfigUser1 = TokenAuthConfig.builder().tokenRequestExecTimeoutInMs(10000)
4848
.expirationRefreshRatio(0.1f).identityProviderConfig(config1).build();
4949
// Create credentials provider user1
50-
TokenBasedRedisCredentialsProvider credentialsUser1 = new TokenBasedRedisCredentialsProvider(tokenAuthConfigUser1);
50+
TokenBasedRedisCredentialsProvider credentialsUser1 = TokenBasedRedisCredentialsProvider.create(tokenAuthConfigUser1);
5151

5252
// User2
5353
// from redis-authx-entraind
@@ -58,7 +58,7 @@ public static void main(String[] args) throws Exception {
5858
.expirationRefreshRatio(0.1f).identityProviderConfig(config2).build();
5959
// Create credentials provider user2
6060
// TODO: lettuce-autx-tba ( TokenBasedRedisCredentialsProvider & Example there)
61-
TokenBasedRedisCredentialsProvider credentialsUser2 = new TokenBasedRedisCredentialsProvider(tokenAuthConfigUser2);
61+
TokenBasedRedisCredentialsProvider credentialsUser2 = TokenBasedRedisCredentialsProvider.create(tokenAuthConfigUser2);
6262

6363
// lettuce-core
6464
RedisURI redisURI1 = RedisURI.create(REDIS_URI);

0 commit comments

Comments
 (0)