Azure Communication Services common utilities for Java. Use when working with CommunicationTokenCredential, user identifiers, token refresh, or shared authentication across ACS services.
Add this skill
npx mdskills install sickn33/azure-communication-common-javaComprehensive Java authentication reference with excellent examples and edge case coverage
1---2name: azure-communication-common-java3description: Azure Communication Services common utilities for Java. Use when working with CommunicationTokenCredential, user identifiers, token refresh, or shared authentication across ACS services.4package: com.azure:azure-communication-common5---67# Azure Communication Common (Java)89Shared authentication utilities and data structures for Azure Communication Services.1011## Installation1213```xml14<dependency>15 <groupId>com.azure</groupId>16 <artifactId>azure-communication-common</artifactId>17 <version>1.4.0</version>18</dependency>19```2021## Key Concepts2223| Class | Purpose |24|-------|---------|25| `CommunicationTokenCredential` | Authenticate users with ACS services |26| `CommunicationTokenRefreshOptions` | Configure automatic token refresh |27| `CommunicationUserIdentifier` | Identify ACS users |28| `PhoneNumberIdentifier` | Identify PSTN phone numbers |29| `MicrosoftTeamsUserIdentifier` | Identify Teams users |30| `UnknownIdentifier` | Generic identifier for unknown types |3132## CommunicationTokenCredential3334### Static Token (Short-lived Clients)3536```java37import com.azure.communication.common.CommunicationTokenCredential;3839// Simple static token - no refresh40String userToken = "<user-access-token>";41CommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);4243// Use with Chat, Calling, etc.44ChatClient chatClient = new ChatClientBuilder()45 .endpoint("https://<resource>.communication.azure.com")46 .credential(credential)47 .buildClient();48```4950### Proactive Token Refresh (Long-lived Clients)5152```java53import com.azure.communication.common.CommunicationTokenRefreshOptions;54import java.util.concurrent.Callable;5556// Token refresher callback - called when token is about to expire57Callable<String> tokenRefresher = () -> {58 // Call your server to get a fresh token59 return fetchNewTokenFromServer();60};6162// With proactive refresh63CommunicationTokenRefreshOptions refreshOptions = new CommunicationTokenRefreshOptions(tokenRefresher)64 .setRefreshProactively(true) // Refresh before expiry65 .setInitialToken(currentToken); // Optional initial token6667CommunicationTokenCredential credential = new CommunicationTokenCredential(refreshOptions);68```6970### Async Token Refresh7172```java73import java.util.concurrent.CompletableFuture;7475// Async token fetcher76Callable<String> asyncRefresher = () -> {77 CompletableFuture<String> future = fetchTokenAsync();78 return future.get(); // Block until token is available79};8081CommunicationTokenRefreshOptions options = new CommunicationTokenRefreshOptions(asyncRefresher)82 .setRefreshProactively(true);8384CommunicationTokenCredential credential = new CommunicationTokenCredential(options);85```8687## Entra ID (Azure AD) Authentication8889```java90import com.azure.identity.InteractiveBrowserCredentialBuilder;91import com.azure.communication.common.EntraCommunicationTokenCredentialOptions;92import java.util.Arrays;93import java.util.List;9495// For Teams Phone Extensibility96InteractiveBrowserCredential entraCredential = new InteractiveBrowserCredentialBuilder()97 .clientId("<your-client-id>")98 .tenantId("<your-tenant-id>")99 .redirectUrl("<your-redirect-uri>")100 .build();101102String resourceEndpoint = "https://<resource>.communication.azure.com";103List<String> scopes = Arrays.asList(104 "https://auth.msft.communication.azure.com/TeamsExtension.ManageCalls"105);106107EntraCommunicationTokenCredentialOptions entraOptions =108 new EntraCommunicationTokenCredentialOptions(entraCredential, resourceEndpoint)109 .setScopes(scopes);110111CommunicationTokenCredential credential = new CommunicationTokenCredential(entraOptions);112```113114## Communication Identifiers115116### CommunicationUserIdentifier117118```java119import com.azure.communication.common.CommunicationUserIdentifier;120121// Create identifier for ACS user122CommunicationUserIdentifier user = new CommunicationUserIdentifier("8:acs:resource-id_user-id");123124// Get raw ID125String rawId = user.getId();126```127128### PhoneNumberIdentifier129130```java131import com.azure.communication.common.PhoneNumberIdentifier;132133// E.164 format phone number134PhoneNumberIdentifier phone = new PhoneNumberIdentifier("+14255551234");135136String phoneNumber = phone.getPhoneNumber(); // "+14255551234"137String rawId = phone.getRawId(); // "4:+14255551234"138```139140### MicrosoftTeamsUserIdentifier141142```java143import com.azure.communication.common.MicrosoftTeamsUserIdentifier;144145// Teams user identifier146MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier("<teams-user-id>")147 .setCloudEnvironment(CommunicationCloudEnvironment.PUBLIC);148149// For anonymous Teams users150MicrosoftTeamsUserIdentifier anonymousTeamsUser = new MicrosoftTeamsUserIdentifier("<teams-user-id>")151 .setAnonymous(true);152```153154### UnknownIdentifier155156```java157import com.azure.communication.common.UnknownIdentifier;158159// For identifiers of unknown type160UnknownIdentifier unknown = new UnknownIdentifier("some-raw-id");161```162163## Identifier Parsing164165```java166import com.azure.communication.common.CommunicationIdentifier;167import com.azure.communication.common.CommunicationIdentifierModel;168169// Parse raw ID to appropriate type170public CommunicationIdentifier parseIdentifier(String rawId) {171 if (rawId.startsWith("8:acs:")) {172 return new CommunicationUserIdentifier(rawId);173 } else if (rawId.startsWith("4:")) {174 String phone = rawId.substring(2);175 return new PhoneNumberIdentifier(phone);176 } else if (rawId.startsWith("8:orgid:")) {177 String teamsId = rawId.substring(8);178 return new MicrosoftTeamsUserIdentifier(teamsId);179 } else {180 return new UnknownIdentifier(rawId);181 }182}183```184185## Type Checking Identifiers186187```java188import com.azure.communication.common.CommunicationIdentifier;189190public void processIdentifier(CommunicationIdentifier identifier) {191 if (identifier instanceof CommunicationUserIdentifier) {192 CommunicationUserIdentifier user = (CommunicationUserIdentifier) identifier;193 System.out.println("ACS User: " + user.getId());194195 } else if (identifier instanceof PhoneNumberIdentifier) {196 PhoneNumberIdentifier phone = (PhoneNumberIdentifier) identifier;197 System.out.println("Phone: " + phone.getPhoneNumber());198199 } else if (identifier instanceof MicrosoftTeamsUserIdentifier) {200 MicrosoftTeamsUserIdentifier teams = (MicrosoftTeamsUserIdentifier) identifier;201 System.out.println("Teams User: " + teams.getUserId());202 System.out.println("Anonymous: " + teams.isAnonymous());203204 } else if (identifier instanceof UnknownIdentifier) {205 UnknownIdentifier unknown = (UnknownIdentifier) identifier;206 System.out.println("Unknown: " + unknown.getId());207 }208}209```210211## Token Access212213```java214import com.azure.core.credential.AccessToken;215216// Get current token (for debugging/logging - don't expose!)217CommunicationTokenCredential credential = new CommunicationTokenCredential(token);218219// Sync access220AccessToken accessToken = credential.getToken();221System.out.println("Token expires: " + accessToken.getExpiresAt());222223// Async access224credential.getTokenAsync()225 .subscribe(token -> {226 System.out.println("Token: " + token.getToken().substring(0, 20) + "...");227 System.out.println("Expires: " + token.getExpiresAt());228 });229```230231## Dispose Credential232233```java234// Clean up when done235credential.close();236237// Or use try-with-resources238try (CommunicationTokenCredential cred = new CommunicationTokenCredential(options)) {239 // Use credential240 chatClient.doSomething();241}242```243244## Cloud Environments245246```java247import com.azure.communication.common.CommunicationCloudEnvironment;248249// Available environments250CommunicationCloudEnvironment publicCloud = CommunicationCloudEnvironment.PUBLIC;251CommunicationCloudEnvironment govCloud = CommunicationCloudEnvironment.GCCH;252CommunicationCloudEnvironment dodCloud = CommunicationCloudEnvironment.DOD;253254// Set on Teams identifier255MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier("<user-id>")256 .setCloudEnvironment(CommunicationCloudEnvironment.GCCH);257```258259## Environment Variables260261```bash262AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com263AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>264```265266## Best Practices2672681. **Proactive Refresh** - Always use `setRefreshProactively(true)` for long-lived clients2692. **Token Security** - Never log or expose full tokens2703. **Close Credentials** - Dispose of credentials when no longer needed2714. **Error Handling** - Handle token refresh failures gracefully2725. **Identifier Types** - Use specific identifier types, not raw strings273274## Common Usage Patterns275276```java277// Pattern: Create credential for Chat/Calling client278public ChatClient createChatClient(String token, String endpoint) {279 CommunicationTokenRefreshOptions refreshOptions =280 new CommunicationTokenRefreshOptions(this::refreshToken)281 .setRefreshProactively(true)282 .setInitialToken(token);283284 CommunicationTokenCredential credential =285 new CommunicationTokenCredential(refreshOptions);286287 return new ChatClientBuilder()288 .endpoint(endpoint)289 .credential(credential)290 .buildClient();291}292293private String refreshToken() {294 // Call your token endpoint295 return tokenService.getNewToken();296}297```298299## Trigger Phrases300301- "ACS authentication", "communication token credential"302- "user access token", "token refresh"303- "CommunicationUserIdentifier", "PhoneNumberIdentifier"304- "Azure Communication Services authentication"305
Full transparency — inspect the skill content before installing.