新闻详情

新闻详情

首页 / 资讯中心 / 详情

vscode-copilot-chat 认证服务使用指南:GitHub 会话与 Copilot Token 的获取、约束与状态流转

发布时间:2026/11/7 8:43:16来源:尧图网络
vscode-copilot-chat 认证服务使用指南:GitHub 会话与 Copilot Token 的获取、约束与状态流转
vscode-copilot-chat 认证服务使用指南GitHub 会话与 Copilot Token 的获取、约束与状态流转【免费下载链接】vscode-copilot-chatCopilot Chat extension for VS Code项目地址: https://gitcode.com/gh_mirrors/vs/vscode-copilot-chat导读本文以 vscode-copilot-chat 仓库中 认证服务使用指南 为骨架系统讲解IAuthenticationService的完整用法如何选择 session kind、三种getGitHubSession重载的适用场景、createIfNone/forceNewSession的强约束、同步缓存属性、Copilot TokenCAPI Token的自动刷新机制以及用户认证状态的三态流转。读完本文你将能在该扩展的源码开发中正确、安全地接入 GitHub 与 Copilot 认证避免常见的 API 误用如向createIfNone传入布尔值、漏掉detail本地化文案、在 Minimal Mode 下强行请求 permissive 权限等。一、认证服务全景它管什么IAuthenticationService是 vscode-copilot-chat 面向扩展内部模块暴露的认证门面统一管理两类凭据GitHub 会话OAuth Token由 VS Code 的authenticationAPI 提供用于调用 GitHub API如仓库、代码搜索等能力。Copilot TokenCAPI Token由 GitHub Token 向 Copilot 后端“铸造”mint而来用于访问 Copilot 的各项服务端点对话、补全等。接口定义位于 src/platform/authentication/common/authentication.tsVS Code 平台实现位于 src/platform/authentication/vscode-node/authenticationService.ts底层会话获取逻辑封装在 src/platform/authentication/vscode-node/session.ts。扩展侧的注册与贡献点位于 src/extension/authentication/vscode-node/authentication.contribution.ts。从源码结构看服务内部还依赖三个协作组件ICopilotTokenStore缓存当前 token、ICopilotTokenManager负责网络拉取与刷新、IConfigurationService读取认证相关配置它们与接口定义一同位于src/platform/authentication/common/目录下。二、第一步认真选择 Session KindgetGitHubSession的第一个参数kind决定了你要申请的 GitHub 会话权限范围文档强调“选择需深思熟虑”Your choice here should be thoughtfulkind所需 Scope适用场景any最小集合如user:email只需要基本访问不需要私有仓库或写权限permissive更广集合read:user、user:email、repo、workflow需要访问私有仓库或执行写操作在源码中这些 scope 常量被明确定义在 src/platform/authentication/common/authentication.ts// Minimum set of scopes needed for Copilot to work export const GITHUB_SCOPE_USER_EMAIL [user:email]; // Old list of scopes still used for backwards compatibility export const GITHUB_SCOPE_READ_USER [read:user]; // The same scopes that GitHub Pull Request, GitHub Repositories, and others use export const GITHUB_SCOPE_ALIGNED [read:user, user:email, repo, workflow];注意any并非“无 scope”而是“能拿到什么算什么”底层getAnyAuthSession会按aligned scopes →user:email→read:user的优先级依次尝试静默获取取第一个成功的会话见 src/platform/authentication/vscode-node/session.ts而getAlignedSession则固定请求 aligned scopessession.ts。从源码注释可以推断GITHUB_SCOPE_READ_USER是为与 Completions 扩展向后兼容而保留的兜底项。三、三个重载交互、强制与静默getGitHubSession通过 options 的形态区分三种调用方式对应三种截然不同的用户体验。在 authentication.ts 中以重载签名形式定义。1. 交互式提示用户登录createIfNone返回类型为PromiseAuthenticationSession永远不会是undefined若用户取消则抛出错误。必须传createIfNone且值为包含本地化detail文案的StrictAuthenticationPresentationOptionsconst session await authService.getGitHubSession(any, { createIfNone: { detail: l10n.t(Sign in to GitHub to use feature X.) } });用户未登录时该调用会触发 VS Code 内置的登录对话框。2. 交互式强制重新登录forceNewSession与上一种行为一致但即使已有会话也会强制重新认证。典型场景是当前 token 已失去授权例如 scope 被回收或权限过期const session await authService.getGitHubSession(any, { forceNewSession: { detail: l10n.t(Sign in again to restore access.) } });在实现层面forceNewSession会额外注入learnMore链接指向仓库权限说明页并设置clearSessionPreference: true以确保账号选择器再次出现见 session.ts。3. 静默绝不弹 UIsilent返回PromiseAuthenticationSession | undefined永远不会显示任何 UI适用于认证可有可无的场景const session await authService.getGitHubSession(any, { silent: true }); if (!session) { // No session available, handle gracefully }其 options 类型被收窄为OmitAuthenticationGetSessionOptions, createIfNone | forceNewSession——从类型层面杜绝了把布尔createIfNone混进静默调用的可能。四、硬性约束这些写法编译不过文档明确列出的三条约束全部由类型系统强制执行createIfNone和forceNewSession不接受boolean。必须传StrictAuthenticationPresentationOptions且其中的detail为必填字符串。传true、false或{}都无法通过编译。该类型定义如下authentication.tsexport type StrictAuthenticationPresentationOptions AuthenticationGetSessionOptions { detail: string };detail必须本地化使用l10n.t(...)包裹确保向用户展示时可翻译。静默重载的 options 类型是OmitAuthenticationGetSessionOptions, createIfNone | forceNewSession无法偷偷塞进布尔createIfNone。这一设计的目的从类型注释可见是强制调用方给用户提供有意义的上下文说明而不是传一个裸的true或空对象。五、同步缓存属性零网络、零 UI 的快速检查当只需要非阻塞地判断当前认证状态时请使用以下缓存属性不发起网络请求、不调用底层 providerauthService.anyGitHubSession—— 缓存的any会话或undefined保证至少有user:emailscope足以访问最小 Copilot API。authService.permissiveGitHubSession—— 缓存的permissive会话或undefined在 Minimal Mode 下恒为undefined。authService.copilotToken—— 缓存的 Copilot TokenOmitCopilotToken, token或undefined。注意不包含原始 token 字符串因为它可能已过期需要可用 token 时请用getCopilotToken()。接口注释明确建议要正确响应认证状态变化应当订阅onDidAuthenticationChange事件authentication.ts。该事件在 token 过期、用户登出、登录更宽松权限的 token、乃至 Copilot Token 铸造失败原因变化等场景下都会被触发。实现细节BaseAuthenticationService内部通过_handleAuthChangeEvent在认证变化时并行静默刷新三类会话缓存any、permissive、ADO并对比前后 accessToken 以决定触发onDidAccessTokenChange还是重新铸造 Copilot Token见 authentication.ts。此外AuthenticationService还会监听 VS Code 的authentication.onDidChangeSessions与域名变化事件来驱动缓存刷新见 vscode-node/authenticationService.ts。六、Copilot Token让刷新自动发生绝大多数调用方只需要一个有效的 CAPI Token此时直接调用getCopilotToken()即可刷新由服务自动完成const token await authService.getCopilotToken();要点如下返回PromiseCopilotToken获取失败时抛出错误可传force参数强制刷新即使未过期。刷新策略RefreshableCopilotTokenManager.getCopilotToken在 token 缺失、距离过期不足 5 分钟或收到force时才重新向服务端请求见 src/platform/authentication/node/copilotTokenManager.ts。服务端返回的 token 带有expires_at与refresh_in字段客户端还会对过期时间做修正expires_at now refresh_in 60s缓冲避免因用户时钟偏快导致 token 提前“过期”见 copilotTokenManager.ts。若通过该 token 请求服务时收到表明 token 失效的 HTTP 错误应调用resetCopilotToken(httpError?)丢弃当前 token下次调用会自动重新获取该流程会附带发送auth.reset_token_code遥测见 copilotTokenManager.ts。CopilotToken对象本身封装了丰富的元数据访问能力sku如free_limited_copilot、no_auth_limited_copilot、copilotPlan、username、organizationList、免费用户配额isChatQuotaExceeded/isCompletionsQuotaExceeded、以及isMcpEnabled()、isCopilotCodeReviewEnabled()等功能开关见 src/platform/authentication/common/copilotToken.ts。其服务端响应结构TokenEnvelope与两级校验策略strict → critical fields 兜底也定义在同一文件中用于应对服务端 schema 漂移。七、Minimal Mode最小权限模式下的行为当authService.isMinimalMode为true时对应配置项advanced.authPermissions设为minimal见 src/platform/configuration/common/configurationService.ts服务不会拉取 permissive token交互式permissive调用直接抛出MinimalModeError静默permissive调用返回undefined。MinimalModeError定义于 authentication.ts在 session.ts 的 getAlignedSession 中实现判定若配置为 Minimal 且请求交互式 aligned 会话则抛错静默则解析为undefined。isMinimalMode本身由配置观测derived驱动配置变化时实时更新。// 交互式 permissive —— Minimal Mode 下抛 MinimalModeError await authService.getGitHubSession(permissive, { createIfNone: { detail: l10n.t(...) } }); // 静默 permissive —— Minimal Mode 下返回 undefined const session await authService.getGitHubSession(permissive, { silent: true }); // undefined相关配置configurationService.ts配置项类型默认值说明advanced.authProviderAuthProviderIdgithub认证提供方可切换为github-enterpriseGitHubEnterprise、microsoftadvanced.authPermissionsAuthPermissionModedefault权限模式default或minimal其中authProviderId()辅助函数会根据配置在github与github-enterprise之间切换见 authentication.ts。八、认证状态三态流转理解用户从何而来文档将用户可能处于的状态归纳为三种理解它们有助于选择正确的获取策略未登录Not signed in不存在任何any会话用户完全没有 GitHub 会话。此时交互式createIfNone调用会弹出 VS Code 内置的登录对话框。通过 VS Code 主动登录Signed in from VS Code用户显式在 VS Code 中登录Accounts 菜单或某次createIfNone提示。由于 VS Code 在登录时一次性请求了更广的 scope会自动获得 permissive token因此any与permissive会话都可用。被动登录Signed in passively例如 Settings Sync用户通过被动机制登录仅获得最小 scope。Copilot Chat 可以基于anytoken 工作但没有permissivetoken。此时发起带createIfNone的permissive调用会提示用户授予额外权限。从实现看状态 2 与状态 3 的关键差异在于 VS Code 登录流程申请的 scope 集合是否包含 aligned scopes而getAnyAuthSession的“宽网捕获”策略先试 aligned、再试最小、最后兜底旧 scope正是为了兼容这三种状态下的会话形态见 session.ts。九、最佳实践清单综合文档与源码为扩展内新功能的认证接入总结如下实践先问“我真的需要 permissive 吗”只有需要私有仓库或写权限时才选permissive否则一律any以降低对用户的权限索取。非必要不弹窗先尝试{ silent: true }拿不到再考虑交互式升级实时状态判断优先使用anyGitHubSession/permissiveGitHubSession/copilotToken缓存属性。交互式调用务必提供本地化 detail{ createIfNone: { detail: l10n.t(...) } }切勿传布尔值。不要缓存旧 tokenCAPI token 会过期始终通过getCopilotToken()获取收到 HTTP 错误时调用resetCopilotToken(httpError)。响应状态变化订阅onDidAuthenticationChange来刷新 UI 或重新初始化依赖认证的功能而不是在每次调用时猜测。尊重 Minimal Mode在isMinimalMode为true时对permissive请求做降级处理静默返回undefined、交互抛MinimalModeError避免功能在最小权限模式下报错崩溃。十、验证与测试仓库为认证逻辑提供了单元测试与模拟实现可作为理解行为的补充材料src/platform/authentication/test/node/authentication.spec.ts —— 对getGitHubSession(any, { silent: true })与getGitHubSession(permissive, { silent: true })的测试用例。src/platform/authentication/test/node/copilotToken.spec.ts —— Copilot Token 相关测试。src/platform/authentication/test/node/simulationTestCopilotTokenManager.ts —— 仿真测试用的 token 管理器。真实调用示例云端会话功能在需要额外权限时使用createIfNone交互式升级copilotCloudSessionsProvider.tsCLI 会话集成则以silent方式获取any会话copilotCLITerminalIntegration.ts。从这些调用点可以看出文档中总结的“静默优先、交互兜底、按需 permissive”正是扩展内部各模块的实际接入范式。【免费下载链接】vscode-copilot-chatCopilot Chat extension for VS Code项目地址: https://gitcode.com/gh_mirrors/vs/vscode-copilot-chat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/6 6:37:16

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/7 0:39:20

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/7 6:36:21

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/6 17:25:36

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/6 14:29:05

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/6 14:29:07

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉