azure-communication-common-java – skill DevOps & Hạ tầng cho agent AI
Tiện ích chung của Azure Communication Services cho Java. Dùng khi làm việc với CommunicationTokenCredential, định danh người dùng, làm mới token hoặc xác thực dùng chung giữa các dịch vụ ACS.
Cài skill azure-communication-common-java bằng một lệnh
Chọn công cụ bạn đang dùng, copy lệnh và dán vào terminal. Skill sẽ nằm trong thư mục skills của công cụ đó và sẵn sàng dùng ở phiên làm việc tiếp theo.
Claude Code
mkdir -p ~/.claude/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-communication-common-java-fc78b.tgz | tar xz -C ~/.claude/skills
Gọi trong Claude Code: /azure-communication-common-java – rồi mô tả công việc bạn muốn làm.
Codex
mkdir -p ~/.codex/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-communication-common-java-fc78b.tgz | tar xz -C ~/.codex/skills
Gọi trong Codex: $azure-communication-common-java – rồi mô tả công việc bạn muốn làm.
Hermes Agent
mkdir -p ~/.hermes/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-communication-common-java-fc78b.tgz | tar xz -C ~/.hermes/skills
Gọi trong Hermes Agent: /azure-communication-common-java – rồi mô tả công việc bạn muốn làm.
DeepSeek
mkdir -p ~/.deepcode/skills && curl -fsSL https://skill.dn1nguoi.com/z/azure-communication-common-java-fc78b.tgz | tar xz -C ~/.deepcode/skills
Gọi trong DeepSeek: /azure-communication-common-java – rồi mô tả công việc bạn muốn làm.
Nội dung SKILL.md
Nội dung SKILL.md gốc bằng tiếng Anh.
Azure Communication Common (Java)
Shared authentication utilities and data structures for Azure Communication Services.
Installation
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-communication-common</artifactId>
<version>1.4.0</version>
</dependency>Key Concepts
| Class | Purpose |
|-------|---------|
| CommunicationTokenCredential | Authenticate users with ACS services |
| CommunicationTokenRefreshOptions | Configure automatic token refresh |
| CommunicationUserIdentifier | Identify ACS users |
| PhoneNumberIdentifier | Identify PSTN phone numbers |
| MicrosoftTeamsUserIdentifier | Identify Teams users |
| UnknownIdentifier | Generic identifier for unknown types |
CommunicationTokenCredential
Static Token (Short-lived Clients)
import com.azure.communication.common.CommunicationTokenCredential;
// Simple static token - no refresh
String userToken = "<user-access-token>";
CommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);
// Use with Chat, Calling, etc.
ChatClient chatClient = new ChatClientBuilder()
.endpoint("https://<resource>.communication.azure.com")
.credential(credential)
.buildClient();Proactive Token Refresh (Long-lived Clients)
import com.azure.communication.common.CommunicationTokenRefreshOptions;
import java.util.concurrent.Callable;
// Token refresher callback - called when token is about to expire
Callable<String> tokenRefresher = () -> {
// Call your server to get a fresh token
return fetchNewTokenFromServer();
};
// With proactive refresh
CommunicationTokenRefreshOptions refreshOptions = new CommunicationTokenRefreshOptions(tokenRefresher)
.setRefreshProactively(true) // Refresh before expiry
.setInitialToken(currentToken); // Optional initial token
CommunicationTokenCredential credential = new CommunicationTokenCredential(refreshOptions);Blocking bridge to an async token source
import java.util.concurrent.CompletableFuture;
// Async token fetcher
Callable<String> asyncRefresher = () -> {
CompletableFuture<String> future = fetchTokenAsync();
return future.get(); // Block until token is available
};
CommunicationTokenRefreshOptions options = new CommunicationTokenRefreshOptions(asyncRefresher)
.setRefreshProactively(true);
CommunicationTokenCredential credential = new CommunicationTokenCredential(options);Entra ID (Azure AD) Authentication
import com.azure.identity.InteractiveBrowserCredentialBuilder;
import com.azure.communication.common.EntraCommunicationTokenCredentialOptions;
import java.util.Arrays;
import java.util.List;
// For Teams Phone Extensibility
InteractiveBrowserCredential entraCredential = new InteractiveBrowserCredentialBuilder()
.clientId("<your-client-id>")
.tenantId("<your-tenant-id>")
.redirectUrl("<your-redirect-uri>")
.build();
String resourceEndpoint = "https://<resource>.communication.azure.com";
List<String> scopes = Arrays.asList(
"https://auth.msft.communication.azure.com/TeamsExtension.ManageCalls"
);
EntraCommunicationTokenCredentialOptions entraOptions =
new EntraCommunicationTokenCredentialOptions(entraCredential, resourceEndpoint)
.setScopes(scopes);
CommunicationTokenCredential credential = new CommunicationTokenCredential(entraOptions);Communication Identifiers
CommunicationUserIdentifier
import com.azure.communication.common.CommunicationUserIdentifier;
// Create identifier for ACS user
CommunicationUserIdentifier user = new CommunicationUserIdentifier("8:acs:resource-id_user-id");
// Get raw ID
String rawId = user.getId();PhoneNumberIdentifier
import com.azure.communication.common.PhoneNumberIdentifier;
// E.164 format phone number
PhoneNumberIdentifier phone = new PhoneNumberIdentifier("+14255551234");
String phoneNumber = phone.getPhoneNumber(); // "+14255551234"
String rawId = phone.getRawId(); // "4:+14255551234"MicrosoftTeamsUserIdentifier
import com.azure.communication.common.MicrosoftTeamsUserIdentifier;
// Teams user identifier
MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier("<teams-user-id>")
.setCloudEnvironment(CommunicationCloudEnvironment.PUBLIC);
// For anonymous Teams users
MicrosoftTeamsUserIdentifier anonymousTeamsUser = new MicrosoftTeamsUserIdentifier("<teams-user-id>")
.setAnonymous(true);UnknownIdentifier
import com.azure.communication.common.UnknownIdentifier;
// For identifiers of unknown type
UnknownIdentifier unknown = new UnknownIdentifier("some-raw-id");Raw-ID prefix parsing below is illustrative and incomplete for cloud/anonymous variants; prefer the pinned SDK's documented conversion APIs and validate identifier type before casts. Token refresh must use an authenticated, authorized backend with bounded request timeouts; future.get() blocks and must not run on an event-loop/UI thread. Never embed ACS resource connection strings or privileged token-issuing credentials in client code. Keep identifier and token diagnostics out of shared logs.
Identifier Parsing
import com.azure.communication.common.CommunicationIdentifier;
import com.azure.communication.common.CommunicationIdentifierModel;
// Parse raw ID to appropriate type
public CommunicationIdentifier parseIdentifier(String rawId) {
if (rawId.startsWith("8:acs:")) {
return new CommunicationUserIdentifier(rawId);
} else if (rawId.startsWith("4:")) {
String phone = rawId.substring(2);
return new PhoneNumberIdentifier(phone);
} else if (rawId.startsWith("8:orgid:")) {
String teamsId = rawId.substring(8);
return new MicrosoftTeamsUserIdentifier(teamsId);
} else {
return new UnknownIdentifier(rawId);
}
}Type Checking Identifiers
import com.azure.communication.common.CommunicationIdentifier;
public void processIdentifier(CommunicationIdentifier identifier) {
if (identifier instanceof CommunicationUserIdentifier) {
CommunicationUserIdentifier user = (CommunicationUserIdentifier) identifier;
System.out.println("ACS User: " + user.getId());
} else if (identifier instanceof PhoneNumberIdentifier) {
PhoneNumberIdentifier phone = (PhoneNumberIdentifier) identifier;
System.out.println("Phone: " + phone.getPhoneNumber());
} else if (identifier instanceof MicrosoftTeamsUserIdentifier) {
MicrosoftTeamsUserIdentifier teams = (MicrosoftTeamsUserIdentifier) identifier;
System.out.println("Teams User: " + teams.getUserId());
System.out.println("Anonymous: " + teams.isAnonymous());
} else if (identifier instanceof UnknownIdentifier) {
UnknownIdentifier unknown = (UnknownIdentifier) identifier;
System.out.println("Unknown: " + unknown.getId());
}
}Token Access
import com.azure.core.credential.AccessToken;
// Get current token (for debugging/logging - don't expose!)
CommunicationTokenCredential credential = new CommunicationTokenCredential(token);
// Sync access
AccessToken accessToken = credential.getToken();
System.out.println("Token expires: " + accessToken.getExpiresAt());
// Async access
credential.getTokenAsync()
.subscribe(token -> {
// Never log even a token prefix; report expiry or a non-secret diagnostic ID only.
System.out.println("Expires: " + token.getExpiresAt());
});Dispose Credential
// Clean up when done
credential.close();
// Or use try-with-resources
try (CommunicationTokenCredential cred = new CommunicationTokenCredential(options)) {
// Use credential
chatClient.doSomething();
}Cloud Environments
import com.azure.communication.common.CommunicationCloudEnvironment;
// Available environments
CommunicationCloudEnvironment publicCloud = CommunicationCloudEnvironment.PUBLIC;
CommunicationCloudEnvironment govCloud = CommunicationCloudEnvironment.GCCH;
CommunicationCloudEnvironment dodCloud = CommunicationCloudEnvironment.DOD;
// Set on Teams identifier
MicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier("<user-id>")
.setCloudEnvironment(CommunicationCloudEnvironment.GCCH);Environment Variables
AZURE_COMMUNICATION_ENDPOINT=https://<resource>.communication.azure.com
AZURE_COMMUNICATION_USER_TOKEN=<user-access-token>Best Practices
1. Proactive Refresh - Always use setRefreshProactively(true) for long-lived clients
2. Token Security - Never log or expose full tokens
3. Close Credentials - Dispose of credentials when no longer needed
4. Error Handling - Handle token refresh failures gracefully
5. Identifier Types - Use specific identifier types, not raw strings
Common Usage Patterns
// Pattern: Create credential for C… (nội dung đầy đủ có trong gói tải về)
Skill liên quan
- linkerd-patterns – Triển khai các mẫu service mesh Linkerd nhẹ, tập trung bảo mật. Dùng khi thiết lập…
- azure-containerregistry-py – SDK Azure Container Registry cho Python. Dùng để quản lý image container, artifact và…
- azure-cosmos-db-py – Xây dựng các dịch vụ Azure Cosmos DB NoSQL sản xuất theo nguyên tắc clean code, thực…
- azure-cosmos-py – SDK Azure Cosmos DB cho Python (NoSQL API). Dùng cho CRUD tài liệu, truy vấn, container…
- azure-cosmos-ts – SDK Azure Cosmos DB cho JavaScript/TypeScript (@azure/cosmos) cho các thao tác data…
- azure-data-tables-py – SDK Azure Tables cho Python (Storage và Cosmos DB). Dùng cho lưu trữ key-value NoSQL…
- azure-devops – Thiết lập Azure Pipelines cho CI/CD, cấu hình pipeline build và release, quản lý dự án…
- azure-eventgrid-dotnet – SDK Azure Event Grid cho .NET. Thư viện client để xuất bản và tiêu thụ sự kiện với Azure…