[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6G2BTCGKGBAFEAQKBTAF34M":3,"skill-same:01M6G2BTCGKGBAFEAQKBTAF34M":65},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":48,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6G2BTCGKGBAFEAQKBTAF34M","azure-communication-common-java",null,"Azure Communication Services common utilities for Java. Use when working with CommunicationTokenCredential, user identifiers, token refresh, or shared authentication across ACS services.","reikiplanet\u002Fdaoskills","reikiplanet","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F96377599?v=4","01M6CVWCMD740YHQDK7E9QYBW4","Reiki Planet","01M6CVWCS4KXVA2CWFVJ43EAXK",0,"MIT","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdevelopment\u002Fazure-communication-common-java\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"azure communication common java","azure","communication","java","common","with","Utilities","azure communication services","token","shared","across","community","use","user","refresh","services","authentication","2026-11-10 10:12:30",false,"---\nname: azure-communication-common-java\ndescription: \"Azure Communication Services common utilities for Java. Use when working with CommunicationTokenCredential, user identifiers, token refresh, or shared authentication across ACS services.\"\npackage: com.azure:azure-communication-common\nrisk: unknown\nsource: community\n---\n\n# Azure Communication Common (Java)\n\nShared authentication utilities and data structures for Azure Communication Services.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-communication-common\u003C\u002FartifactId>\n    \u003Cversion>1.4.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Key Concepts\n\n| Class | Purpose |\n|-------|---------|\n| `CommunicationTokenCredential` | Authenticate users with ACS services |\n| `CommunicationTokenRefreshOptions` | Configure automatic token refresh |\n| `CommunicationUserIdentifier` | Identify ACS users |\n| `PhoneNumberIdentifier` | Identify PSTN phone numbers |\n| `MicrosoftTeamsUserIdentifier` | Identify Teams users |\n| `UnknownIdentifier` | Generic identifier for unknown types |\n\n## CommunicationTokenCredential\n\n### Static Token (Short-lived Clients)\n\n```java\nimport com.azure.communication.common.CommunicationTokenCredential;\n\n\u002F\u002F Simple static token - no refresh\nString userToken = \"\u003Cuser-access-token>\";\nCommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);\n\n\u002F\u002F Use with Chat, Calling, etc.\nChatClient chatClient = new ChatClientBuilder()\n    .endpoint(\"https:\u002F\u002F\u003Cresource>.communication.azure.com\")\n    .credential(credential)\n    .buildClient();\n```\n\n### Proactive Token Refresh (Long-lived Clients)\n\n```java\nimport com.azure.communication.common.CommunicationTokenRefreshOptions;\nimport java.util.concurrent.Callable;\n\n\u002F\u002F Token refresher callback - called when token is about to expire\nCallable\u003CString> tokenRefresher = () -> {\n    \u002F\u002F Call your server to get a fresh token\n    return fetchNewTokenFromServer();\n};\n\n\u002F\u002F With proactive refresh\nCommunicationTokenRefreshOptions refreshOptions = new CommunicationTokenRefreshOptions(tokenRefresher)\n    .setRefreshProactively(true)      \u002F\u002F Refresh before expiry\n    .setInitialToken(currentToken);    \u002F\u002F Optional initial token\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(refreshOptions);\n```\n\n### Async Token Refresh\n\n```java\nimport java.util.concurrent.CompletableFuture;\n\n\u002F\u002F Async token fetcher\nCallable\u003CString> asyncRefresher = () -> {\n    CompletableFuture\u003CString> future = fetchTokenAsync();\n    return future.get();  \u002F\u002F Block until token is available\n};\n\nCommunicationTokenRefreshOptions options = new CommunicationTokenRefreshOptions(asyncRefresher)\n    .setRefreshProactively(true);\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(options);\n```\n\n## Entra ID (Azure AD) Authentication\n\n```java\nimport com.azure.identity.InteractiveBrowserCredentialBuilder;\nimport com.azure.communication.common.EntraCommunicationTokenCredentialOptions;\nimport java.util.Arrays;\nimport java.util.List;\n\n\u002F\u002F For Teams Phone Extensibility\nInteractiveBrowserCredential entraCredential = new InteractiveBrowserCredentialBuilder()\n    .clientId(\"\u003Cyour-client-id>\")\n    .tenantId(\"\u003Cyour-tenant-id>\")\n    .redirectUrl(\"\u003Cyour-redirect-uri>\")\n    .build();\n\nString resourceEndpoint = \"https:\u002F\u002F\u003Cresource>.communication.azure.com\";\nList\u003CString> scopes = Arrays.asList(\n    \"https:\u002F\u002Fauth.msft.communication.azure.com\u002FTeamsExtension.ManageCalls\"\n);\n\nEntraCommunicationTokenCredentialOptions entraOptions = \n    new EntraCommunicationTokenCredentialOptions(entraCredential, resourceEndpoint)\n        .setScopes(scopes);\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(entraOptions);\n```\n\n## Communication Identifiers\n\n### CommunicationUserIdentifier\n\n```java\nimport com.azure.communication.common.CommunicationUserIdentifier;\n\n\u002F\u002F Create identifier for ACS user\nCommunicationUserIdentifier user = new CommunicationUserIdentifier(\"8:acs:resource-id_user-id\");\n\n\u002F\u002F Get raw ID\nString rawId = user.getId();\n```\n\n### PhoneNumberIdentifier\n\n```java\nimport com.azure.communication.common.PhoneNumberIdentifier;\n\n\u002F\u002F E.164 format phone number\nPhoneNumberIdentifier phone = new PhoneNumberIdentifier(\"+14255551234\");\n\nString phoneNumber = phone.getPhoneNumber();  \u002F\u002F \"+14255551234\"\nString rawId = phone.getRawId();              \u002F\u002F \"4:+14255551234\"\n```\n\n### MicrosoftTeamsUserIdentifier\n\n```java\nimport com.azure.communication.common.MicrosoftTeamsUserIdentifier;\n\n\u002F\u002F Teams user identifier\nMicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cteams-user-id>\")\n    .setCloudEnvironment(CommunicationCloudEnvironment.PUBLIC);\n\n\u002F\u002F For anonymous Teams users\nMicrosoftTeamsUserIdentifier anonymousTeamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cteams-user-id>\")\n    .setAnonymous(true);\n```\n\n### UnknownIdentifier\n\n```java\nimport com.azure.communication.common.UnknownIdentifier;\n\n\u002F\u002F For identifiers of unknown type\nUnknownIdentifier unknown = new UnknownIdentifier(\"some-raw-id\");\n```\n\n## Identifier Parsing\n\n```java\nimport com.azure.communication.common.CommunicationIdentifier;\nimport com.azure.communication.common.CommunicationIdentifierModel;\n\n\u002F\u002F Parse raw ID to appropriate type\npublic CommunicationIdentifier parseIdentifier(String rawId) {\n    if (rawId.startsWith(\"8:acs:\")) {\n        return new CommunicationUserIdentifier(rawId);\n    } else if (rawId.startsWith(\"4:\")) {\n        String phone = rawId.substring(2);\n        return new PhoneNumberIdentifier(phone);\n    } else if (rawId.startsWith(\"8:orgid:\")) {\n        String teamsId = rawId.substring(8);\n        return new MicrosoftTeamsUserIdentifier(teamsId);\n    } else {\n        return new UnknownIdentifier(rawId);\n    }\n}\n```\n\n## Type Checking Identifiers\n\n```java\nimport com.azure.communication.common.CommunicationIdentifier;\n\npublic void processIdentifier(CommunicationIdentifier identifier) {\n    if (identifier instanceof CommunicationUserIdentifier) {\n        CommunicationUserIdentifier user = (CommunicationUserIdentifier) identifier;\n        System.out.println(\"ACS User: \" + user.getId());\n        \n    } else if (identifier instanceof PhoneNumberIdentifier) {\n        PhoneNumberIdentifier phone = (PhoneNumberIdentifier) identifier;\n        System.out.println(\"Phone: \" + phone.getPhoneNumber());\n        \n    } else if (identifier instanceof MicrosoftTeamsUserIdentifier) {\n        MicrosoftTeamsUserIdentifier teams = (MicrosoftTeamsUserIdentifier) identifier;\n        System.out.println(\"Teams User: \" + teams.getUserId());\n        System.out.println(\"Anonymous: \" + teams.isAnonymous());\n        \n    } else if (identifier instanceof UnknownIdentifier) {\n        UnknownIdentifier unknown = (UnknownIdentifier) identifier;\n        System.out.println(\"Unknown: \" + unknown.getId());\n    }\n}\n```\n\n## Token Access\n\n```java\nimport com.azure.core.credential.AccessToken;\n\n\u002F\u002F Get current token (for debugging\u002Flogging - don't expose!)\nCommunicationTokenCredential credential = new CommunicationTokenCredential(token);\n\n\u002F\u002F Sync access\nAccessToken accessToken = credential.getToken();\nSystem.out.println(\"Token expires: \" + accessToken.getExpiresAt());\n\n\u002F\u002F Async access\ncredential.getTokenAsync()\n    .subscribe(token -> {\n        System.out.println(\"Token: \" + token.getToken().substring(0, 20) + \"...\");\n        System.out.println(\"Expires: \" + token.getExpiresAt());\n    });\n```\n\n## Dispose Credential\n\n```java\n\u002F\u002F Clean up when done\ncredential.close();\n\n\u002F\u002F Or use try-with-resources\ntry (CommunicationTokenCredential cred = new CommunicationTokenCredential(options)) {\n    \u002F\u002F Use credential\n    chatClient.doSomething();\n}\n```\n\n## Cloud Environments\n\n```java\nimport com.azure.communication.common.CommunicationCloudEnvironment;\n\n\u002F\u002F Available environments\nCommunicationCloudEnvironment publicCloud = CommunicationCloudEnvironment.PUBLIC;\nCommunicationCloudEnvironment govCloud = CommunicationCloudEnvironment.GCCH;\nCommunicationCloudEnvironment dodCloud = CommunicationCloudEnvironment.DOD;\n\n\u002F\u002F Set on Teams identifier\nMicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cuser-id>\")\n    .setCloudEnvironment(CommunicationCloudEnvironment.GCCH);\n```\n\n## Environment Variables\n\n```bash\nAZURE_COMMUNICATION_ENDPOINT=https:\u002F\u002F\u003Cresource>.communication.azure.com\nAZURE_COMMUNICATION_USER_TOKEN=\u003Cuser-access-token>\n```\n\n## Best Practices\n\n1. **Proactive Refresh** - Always use `setRefreshProactively(true)` for long-lived clients\n2. **Token Security** - Never log or expose full tokens\n3. **Close Credentials** - Dispose of credentials when no longer needed\n4. **Error Handling** - Handle token refresh failures gracefully\n5. **Identifier Types** - Use specific identifier types, not raw strings\n\n## Common Usage Patterns\n\n```java\n\u002F\u002F Pattern: Create credential for Chat\u002FCalling client\npublic ChatClient createChatClient(String token, String endpoint) {\n    CommunicationTokenRefreshOptions refreshOptions = \n        new CommunicationTokenRefreshOptions(this::refreshToken)\n            .setRefreshProactively(true)\n            .setInitialToken(token);\n    \n    CommunicationTokenCredential credential = \n        new CommunicationTokenCredential(refreshOptions);\n    \n    return new ChatClientBuilder()\n        .endpoint(endpoint)\n        .credential(credential)\n        .buildClient();\n}\n\nprivate String refreshToken() {\n    \u002F\u002F Call your token endpoint\n    return tokenService.getNewToken();\n}\n```\n\n## Trigger Phrases\n\n- \"ACS authentication\", \"communication token credential\"\n- \"user access token\", \"token refresh\"\n- \"CommunicationUserIdentifier\", \"PhoneNumberIdentifier\"\n- \"Azure Communication Services authentication\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure Communication Common (Java)\n\nShared authentication utilities and data structures for Azure Communication Services.\n\n## Installation\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>com.azure\u003C\u002FgroupId>\n    \u003CartifactId>azure-communication-common\u003C\u002FartifactId>\n    \u003Cversion>1.4.0\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n## Key Concepts\n\n| Class | Purpose |\n|-------|---------|\n| `CommunicationTokenCredential` | Authenticate users with ACS services |\n| `CommunicationTokenRefreshOptions` | Configure automatic token refresh |\n| `CommunicationUserIdentifier` | Identify ACS users |\n| `PhoneNumberIdentifier` | Identify PSTN phone numbers |\n| `MicrosoftTeamsUserIdentifier` | Identify Teams users |\n| `UnknownIdentifier` | Generic identifier for unknown types |\n\n## CommunicationTokenCredential\n\n### Static Token (Short-lived Clients)\n\n```java\nimport com.azure.communication.common.CommunicationTokenCredential;\n\n\u002F\u002F Simple static token - no refresh\nString userToken = \"\u003Cuser-access-token>\";\nCommunicationTokenCredential credential = new CommunicationTokenCredential(userToken);\n\n\u002F\u002F Use with Chat, Calling, etc.\nChatClient chatClient = new ChatClientBuilder()\n    .endpoint(\"https:\u002F\u002F\u003Cresource>.communication.azure.com\")\n    .credential(credential)\n    .buildClient();\n```\n\n### Proactive Token Refresh (Long-lived Clients)\n\n```java\nimport com.azure.communication.common.CommunicationTokenRefreshOptions;\nimport java.util.concurrent.Callable;\n\n\u002F\u002F Token refresher callback - called when token is about to expire\nCallable\u003CString> tokenRefresher = () -> {\n    \u002F\u002F Call your server to get a fresh token\n    return fetchNewTokenFromServer();\n};\n\n\u002F\u002F With proactive refresh\nCommunicationTokenRefreshOptions refreshOptions = new CommunicationTokenRefreshOptions(tokenRefresher)\n    .setRefreshProactively(true)      \u002F\u002F Refresh before expiry\n    .setInitialToken(currentToken);    \u002F\u002F Optional initial token\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(refreshOptions);\n```\n\n### Async Token Refresh\n\n```java\nimport java.util.concurrent.CompletableFuture;\n\n\u002F\u002F Async token fetcher\nCallable\u003CString> asyncRefresher = () -> {\n    CompletableFuture\u003CString> future = fetchTokenAsync();\n    return future.get();  \u002F\u002F Block until token is available\n};\n\nCommunicationTokenRefreshOptions options = new CommunicationTokenRefreshOptions(asyncRefresher)\n    .setRefreshProactively(true);\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(options);\n```\n\n## Entra ID (Azure AD) Authentication\n\n```java\nimport com.azure.identity.InteractiveBrowserCredentialBuilder;\nimport com.azure.communication.common.EntraCommunicationTokenCredentialOptions;\nimport java.util.Arrays;\nimport java.util.List;\n\n\u002F\u002F For Teams Phone Extensibility\nInteractiveBrowserCredential entraCredential = new InteractiveBrowserCredentialBuilder()\n    .clientId(\"\u003Cyour-client-id>\")\n    .tenantId(\"\u003Cyour-tenant-id>\")\n    .redirectUrl(\"\u003Cyour-redirect-uri>\")\n    .build();\n\nString resourceEndpoint = \"https:\u002F\u002F\u003Cresource>.communication.azure.com\";\nList\u003CString> scopes = Arrays.asList(\n    \"https:\u002F\u002Fauth.msft.communication.azure.com\u002FTeamsExtension.ManageCalls\"\n);\n\nEntraCommunicationTokenCredentialOptions entraOptions = \n    new EntraCommunicationTokenCredentialOptions(entraCredential, resourceEndpoint)\n        .setScopes(scopes);\n\nCommunicationTokenCredential credential = new CommunicationTokenCredential(entraOptions);\n```\n\n## Communication Identifiers\n\n### CommunicationUserIdentifier\n\n```java\nimport com.azure.communication.common.CommunicationUserIdentifier;\n\n\u002F\u002F Create identifier for ACS user\nCommunicationUserIdentifier user = new CommunicationUserIdentifier(\"8:acs:resource-id_user-id\");\n\n\u002F\u002F Get raw ID\nString rawId = user.getId();\n```\n\n### PhoneNumberIdentifier\n\n```java\nimport com.azure.communication.common.PhoneNumberIdentifier;\n\n\u002F\u002F E.164 format phone number\nPhoneNumberIdentifier phone = new PhoneNumberIdentifier(\"+14255551234\");\n\nString phoneNumber = phone.getPhoneNumber();  \u002F\u002F \"+14255551234\"\nString rawId = phone.getRawId();              \u002F\u002F \"4:+14255551234\"\n```\n\n### MicrosoftTeamsUserIdentifier\n\n```java\nimport com.azure.communication.common.MicrosoftTeamsUserIdentifier;\n\n\u002F\u002F Teams user identifier\nMicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cteams-user-id>\")\n    .setCloudEnvironment(CommunicationCloudEnvironment.PUBLIC);\n\n\u002F\u002F For anonymous Teams users\nMicrosoftTeamsUserIdentifier anonymousTeamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cteams-user-id>\")\n    .setAnonymous(true);\n```\n\n### UnknownIdentifier\n\n```java\nimport com.azure.communication.common.UnknownIdentifier;\n\n\u002F\u002F For identifiers of unknown type\nUnknownIdentifier unknown = new UnknownIdentifier(\"some-raw-id\");\n```\n\n## Identifier Parsing\n\n```java\nimport com.azure.communication.common.CommunicationIdentifier;\nimport com.azure.communication.common.CommunicationIdentifierModel;\n\n\u002F\u002F Parse raw ID to appropriate type\npublic CommunicationIdentifier parseIdentifier(String rawId) {\n    if (rawId.startsWith(\"8:acs:\")) {\n        return new CommunicationUserIdentifier(rawId);\n    } else if (rawId.startsWith(\"4:\")) {\n        String phone = rawId.substring(2);\n        return new PhoneNumberIdentifier(phone);\n    } else if (rawId.startsWith(\"8:orgid:\")) {\n        String teamsId = rawId.substring(8);\n        return new MicrosoftTeamsUserIdentifier(teamsId);\n    } else {\n        return new UnknownIdentifier(rawId);\n    }\n}\n```\n\n## Type Checking Identifiers\n\n```java\nimport com.azure.communication.common.CommunicationIdentifier;\n\npublic void processIdentifier(CommunicationIdentifier identifier) {\n    if (identifier instanceof CommunicationUserIdentifier) {\n        CommunicationUserIdentifier user = (CommunicationUserIdentifier) identifier;\n        System.out.println(\"ACS User: \" + user.getId());\n        \n    } else if (identifier instanceof PhoneNumberIdentifier) {\n        PhoneNumberIdentifier phone = (PhoneNumberIdentifier) identifier;\n        System.out.println(\"Phone: \" + phone.getPhoneNumber());\n        \n    } else if (identifier instanceof MicrosoftTeamsUserIdentifier) {\n        MicrosoftTeamsUserIdentifier teams = (MicrosoftTeamsUserIdentifier) identifier;\n        System.out.println(\"Teams User: \" + teams.getUserId());\n        System.out.println(\"Anonymous: \" + teams.isAnonymous());\n        \n    } else if (identifier instanceof UnknownIdentifier) {\n        UnknownIdentifier unknown = (UnknownIdentifier) identifier;\n        System.out.println(\"Unknown: \" + unknown.getId());\n    }\n}\n```\n\n## Token Access\n\n```java\nimport com.azure.core.credential.AccessToken;\n\n\u002F\u002F Get current token (for debugging\u002Flogging - don't expose!)\nCommunicationTokenCredential credential = new CommunicationTokenCredential(token);\n\n\u002F\u002F Sync access\nAccessToken accessToken = credential.getToken();\nSystem.out.println(\"Token expires: \" + accessToken.getExpiresAt());\n\n\u002F\u002F Async access\ncredential.getTokenAsync()\n    .subscribe(token -> {\n        System.out.println(\"Token: \" + token.getToken().substring(0, 20) + \"...\");\n        System.out.println(\"Expires: \" + token.getExpiresAt());\n    });\n```\n\n## Dispose Credential\n\n```java\n\u002F\u002F Clean up when done\ncredential.close();\n\n\u002F\u002F Or use try-with-resources\ntry (CommunicationTokenCredential cred = new CommunicationTokenCredential(options)) {\n    \u002F\u002F Use credential\n    chatClient.doSomething();\n}\n```\n\n## Cloud Environments\n\n```java\nimport com.azure.communication.common.CommunicationCloudEnvironment;\n\n\u002F\u002F Available environments\nCommunicationCloudEnvironment publicCloud = CommunicationCloudEnvironment.PUBLIC;\nCommunicationCloudEnvironment govCloud = CommunicationCloudEnvironment.GCCH;\nCommunicationCloudEnvironment dodCloud = CommunicationCloudEnvironment.DOD;\n\n\u002F\u002F Set on Teams identifier\nMicrosoftTeamsUserIdentifier teamsUser = new MicrosoftTeamsUserIdentifier(\"\u003Cuser-id>\")\n    .setCloudEnvironment(CommunicationCloudEnvironment.GCCH);\n```\n\n## Environment Variables\n\n```bash\nAZURE_COMMUNICATION_ENDPOINT=https:\u002F\u002F\u003Cresource>.communication.azure.com\nAZURE_COMMUNICATION_USER_TOKEN=\u003Cuser-access-token>\n```\n\n## Best Practices\n\n1. **Proactive Refresh** - Always use `setRefreshProactively(true)` for long-lived clients\n2. **Token Security** - Never log or expose full tokens\n3. **Close Credentials** - Dispose of credentials when no longer needed\n4. **Error Handling** - Handle token refresh failures gracefully\n5. **Identifier Types** - Use specific identifier types, not raw strings\n\n## Common Usage Patterns\n\n```java\n\u002F\u002F Pattern: Create credential for Chat\u002FCalling client\npublic ChatClient createChatClient(String token, String endpoint) {\n    CommunicationTokenRefreshOptions refreshOptions = \n        new CommunicationTokenRefreshOptions(this::refreshToken)\n            .setRefreshProactively(true)\n            .setInitialToken(token);\n    \n    CommunicationTokenCredential credential = \n        new CommunicationTokenCredential(refreshOptions);\n    \n    return new ChatClientBuilder()\n        .endpoint(endpoint)\n        .credential(credential)\n        .buildClient();\n}\n\nprivate String refreshToken() {\n    \u002F\u002F Call your token endpoint\n    return tokenService.getNewToken();\n}\n```\n\n## Trigger Phrases\n\n- \"ACS authentication\", \"communication token credential\"\n- \"user access token\", \"token refresh\"\n- \"CommunicationUserIdentifier\", \"PhoneNumberIdentifier\"\n- \"Azure Communication Services authentication\"\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{"name":5,"risk":41,"source":30,"package":42,"description":7},"unknown","com.azure:azure-communication-common","master","dff58085da947e81e8418c922055644bf0082b1b","skills\u002Fdevelopment\u002Fazure-communication-common-java","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills","https:\u002F\u002Fgithub.com\u002Freikiplanet","https:\u002F\u002Fwww.reiki-planet.com","Reiki Planet Game","2026-03-29 06:02:29",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add reikiplanet\u002Fdaoskills --skill azure-communication-common-java",{"tool":57,"command":58},"bunx","bunx skills add reikiplanet\u002Fdaoskills --skill azure-communication-common-java",{"tool":60,"command":61},"pnpm","pnpm dlx skills add reikiplanet\u002Fdaoskills --skill azure-communication-common-java","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fdevelopment\u002Fazure-communication-common-java\u002FSKILL.md",true,[],[66,92,104,118,137,160],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":36},"01M6G614JTEQJHPT8AKK3YQ18S","web-games","Web browser game development principles. Framework selection, WebGPU, optimization, PWA.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fweb-games\u002FSKILL.md",[],[73,74,75,76,77,78,30,79,80,81,82,83,84,85,86,87,88,89,90,91],"games","web games","web","grep","principles","selection","framework selection","edit","write","read","pwa","game","web browser","game development","Optimization","framework","browser","development","webgpu",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":36},"01M6G611H2YGV0GZFP90D38ZMJ","vr-ar","VR\u002FAR development principles. Comfort, interaction, performance requirements.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fvr-ar\u002FSKILL.md",[],[99,100,90,101,102,30,80,81,82,76,103,77],"ar","vr ar","interaction","requirements","performance",{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":36},"01M6G60XNMHAMV1SV0EJ1CX0AY","templates","Project scaffolding templates for new applications. Use when creating new projects from scratch. Contains 12 templates for various tech stacks.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Ftemplates\u002FSKILL.md",[],[106,111,112,113,114,115,30,31,82,116,117,76],"project scaffolding","From Scratch","tech","project","scaffolding","projects","applications",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":36},"01M6G60T0GATMK3Q5H8GDC1Z8S","wcag-audit-patterns","Conduct WCAG 2.2 accessibility audits with automated testing, manual verification, and remediation guidance. Use when auditing websites for accessibility, fixing WCAG violations, or implementing ac...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fwcag-audit-patterns\u002FSKILL.md",[],[125,126,127,128,129,30,130,24,131,132,31,133,134,135,136],"wcag audit patterns","wcag audit","patterns","WCAG","audit","manual","automated testing","guidance","remediation","verification","accessibility","testing",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":36},"01M6G60PMCHW1FRZ63F931QK3R","vulnerability-scanner","Advanced vulnerability analysis principles. OWASP 2025, Supply Chain Security, attack surface mapping, risk prioritization.","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fvulnerability-scanner\u002FSKILL.md",[],[144,145,146,147,148,149,150,151,30,82,76,152,77,153,154,155,156,157,158,159],"scanner","vulnerability scanner","vulnerability","prioritization","2025","mapping","chain","supply chain","Bash","analysis","risk","owasp","supply chain security","security","supply","advanced",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":36},"01M6G60JZBB8DK0W3DSG1WNMZK","threat-modeling-expert","Expert in threat modeling methodologies, security architecture review, and risk assessment. Masters STRIDE, PASTA, attack trees, and security requirement extraction. Use for security architecture r...","https:\u002F\u002Fgithub.com\u002Freikiplanet\u002Fdaoskills\u002Fblob\u002Fmaster\u002Fskills\u002Fsecurity\u002Fthreat-modeling-expert\u002FSKILL.md",[],[167,168,169,170,171,172,173,174,157,31,175,176,177,30,178,179,180,154,181,182],"modeling","threat modeling expert","threat modeling","expert","threat","risk assessment","architecture review","architecture","security architecture review","trees","security architecture","security requirement extraction","assessment","extraction","review","stride"]