Skip to content

Commit e63c3e1

Browse files
authored
[Communication] - Chat - Replaced ChatUserCredentialPolicy with BearerTokenAuthenticationPolicy (Azure#17452)
* Replaced ChatUserCredentialPolicy with BearerTokenAuthenticationPolicy * Removed ChatUserCredentialPolicy * Added tests for CommunicationTokenCredential
1 parent 2bf7163 commit e63c3e1

File tree

4 files changed

+101
-64
lines changed

4 files changed

+101
-64
lines changed

sdk/communication/azure-communication-chat/src/main/java/com/azure/communication/chat/ChatClientBuilder.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package com.azure.communication.chat;
55

66
import com.azure.communication.chat.implementation.AzureCommunicationChatServiceImplBuilder;
7+
import com.azure.communication.common.CommunicationTokenCredential;
78
import com.azure.communication.common.CommunicationUserCredential;
89

910
import java.util.ArrayList;
@@ -14,6 +15,7 @@
1415
import com.azure.core.http.HttpClient;
1516
import com.azure.core.http.HttpPipeline;
1617
import com.azure.core.http.HttpPipelineBuilder;
18+
import com.azure.core.http.policy.BearerTokenAuthenticationPolicy;
1719
import com.azure.core.http.policy.CookiePolicy;
1820
import com.azure.core.http.policy.HttpLogOptions;
1921
import com.azure.core.http.policy.HttpLoggingPolicy;
@@ -139,7 +141,7 @@ public ChatClientBuilder configuration(Configuration configuration) {
139141
}
140142

141143
/**
142-
* Create synchronous client applying ChatUserCredentialPolicy, UserAgentPolicy,
144+
* Create synchronous client applying CommunicationTokenCredential, UserAgentPolicy,
143145
* RetryPolicy, and CookiePolicy.
144146
* Additional HttpPolicies specified by additionalPolicies will be applied after them
145147
*
@@ -151,7 +153,7 @@ public ChatClient buildClient() {
151153
}
152154

153155
/**
154-
* Create asynchronous client applying ChatUserCredentialPolicy, UserAgentPolicy,
156+
* Create asynchronous client applying CommunicationTokenCredential, UserAgentPolicy,
155157
* RetryPolicy, and CookiePolicy.
156158
* Additional HttpPolicies specified by additionalPolicies will be applied after them
157159
*
@@ -166,9 +168,11 @@ public ChatAsyncClient buildAsyncClient() {
166168
} else {
167169
Objects.requireNonNull(communicationUserCredential);
168170
Objects.requireNonNull(httpClient);
171+
CommunicationTokenCredential tokenCredential =
172+
new CommunicationTokenCredential(communicationUserCredential);
169173

170174
pipeline = createHttpPipeline(httpClient,
171-
new ChatUserCredentialPolicy(communicationUserCredential),
175+
new BearerTokenAuthenticationPolicy(tokenCredential, ""),
172176
customPolicies);
173177
}
174178

sdk/communication/azure-communication-chat/src/main/java/com/azure/communication/chat/ChatUserCredentialPolicy.java

Lines changed: 0 additions & 61 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
package com.azure.communication.common;
5+
6+
import java.util.concurrent.ExecutionException;
7+
8+
import com.azure.core.credential.AccessToken;
9+
import com.azure.core.credential.TokenCredential;
10+
import com.azure.core.credential.TokenRequestContext;
11+
12+
import reactor.core.publisher.Mono;
13+
14+
/**
15+
* This class serves as a CommunicationUserCredential wrapper that
16+
* allows using BearerAuthenticationPolicy in different clients
17+
*/
18+
public class CommunicationTokenCredential implements TokenCredential {
19+
private final CommunicationUserCredential credential;
20+
21+
/**
22+
* Creates a CommunicationTokenCredential
23+
*
24+
* @param communicationUserCredential The {@link CommunicationUserCredential} to use
25+
* in the BearerAuthenticationPolicy.
26+
*/
27+
public CommunicationTokenCredential(CommunicationUserCredential communicationUserCredential) {
28+
credential = communicationUserCredential;
29+
}
30+
31+
@Override
32+
public Mono<AccessToken> getToken(TokenRequestContext request) {
33+
try {
34+
return Mono.just(credential.getToken().get());
35+
} catch (InterruptedException ex) {
36+
return Mono.error(ex);
37+
} catch (ExecutionException ex) {
38+
return Mono.error(ex);
39+
}
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
package com.azure.communication.common;
4+
5+
import com.azure.communication.common.implementation.JwtTokenMocker;
6+
import com.azure.core.credential.AccessToken;
7+
import com.azure.core.credential.TokenRequestContext;
8+
9+
import org.junit.jupiter.api.Test;
10+
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
import static org.junit.jupiter.api.Assertions.assertFalse;
13+
import static org.junit.jupiter.api.Assertions.assertEquals;
14+
15+
import java.io.IOException;
16+
import java.util.ArrayList;
17+
import java.util.List;
18+
import java.util.concurrent.ExecutionException;
19+
20+
public class CommunicationTokenCrendentialTests {
21+
private final JwtTokenMocker tokenMocker = new JwtTokenMocker();
22+
23+
public TokenRequestContext mockTokenRequestContext() {
24+
String scope = "the scope value";
25+
List<String> scopes = new ArrayList<>();
26+
scopes.add(scope);
27+
TokenRequestContext tokenRequestContext = new TokenRequestContext().setScopes(scopes);
28+
return tokenRequestContext;
29+
}
30+
@Test
31+
public void constructWithValidTokenWithoutFresher() throws InterruptedException, ExecutionException, IOException {
32+
String tokenStr = tokenMocker.generateRawToken("resourceId", "userIdentity", 3 * 60);
33+
CommunicationUserCredential userCredential = new CommunicationUserCredential(tokenStr);
34+
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userCredential);
35+
36+
AccessToken token = tokenCredential.getToken(mockTokenRequestContext()).block();
37+
assertFalse(token.isExpired(),
38+
"Statically cached AccessToken should not expire when expiry is set to 3 minutes later");
39+
assertEquals(tokenStr, token.getToken());
40+
userCredential.close();
41+
}
42+
43+
@Test
44+
public void constructWithExpiredTokenWithoutRefresher() throws InterruptedException, ExecutionException, IOException {
45+
String tokenStr = tokenMocker.generateRawToken("resourceId", "userIdentity", -3 * 60);
46+
CommunicationUserCredential userCredential = new CommunicationUserCredential(tokenStr);
47+
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userCredential);
48+
AccessToken token = tokenCredential.getToken(mockTokenRequestContext()).block();
49+
assertTrue(token.isExpired(),
50+
"Statically cached AccessToken should expire when expiry is set to 3 minutes before");
51+
userCredential.close();
52+
}
53+
}

0 commit comments

Comments
 (0)