credential.get() 返回 undefined 或 Promise 拒绝的主因是安全上下文不满足(仅 HTTPS/localhost)或用户拒绝授权;返回凭证不含 password 属正常设计,应以 credential.id 发起后端校验;须用 credential.get() 替代已废弃的 request(),并配合 autocomplete 语义化表单触发自动填充。
调用 credential.get() 后没拿到数据,常见原因是页面未满足安全上下文要求或用户未

localhost)下运行,HTTP 页面会直接抛出 SecurityError。另外,浏览器会弹出权限提示,若用户点击“拒绝”或之前已永久拒绝,Promise 会以 NotAllowedError 拒绝。
window.location.protocol 必须为 "https:" 或 "http:" 且主机为 "localhost"
button.onclick 或 form.onsubmit 中credential.get({ password: true })
.catch(err => {
console.error(err.name); // 如 "SecurityError"、"NotAllowedError"、"NotFoundError"
});即使传入 { password: true },返回的 PasswordCredential 实例也可能不含 password 属性——这是有意设计:浏览器只在「用户明确选择该账号并确认提交」后才暴露密码,否则仅提供 id、name、iconURL 等元信息用于 UI 渲染。
credential.password 在部分浏览器(如 Safari)始终为 undefined,不可依赖credential.id 发起后端查询,由服务端校验并下发 session
这两个方法名字相似但行为不同:credential.request() 是旧版(已废弃)接口,仅 Firefox 早期支持;credential.get() 是现行标准,必须使用它。若代码里还写着 navigator.credentials.request,运行时会报 TypeError: navigator.credentials.request is not a function。
navigator.credentials.get(),参数结构保持一致if ('get' in navigator.credentials) {
navigator.credentials.get({ password: true });
}document.querySelector('input[type="password"]') 手动取值——这绕过安全模型,且无法触发自动填充逻辑单纯调用 credential.get() 不足以激活浏览器的自动填充行为。必须配合语义化表单,让浏览器识别出登录上下文。
autocomplete="username" 和 autocomplete="current-password" 的输入框type="submit",且表单要有 action(可为空字符串)credential.get() 不会凭空生成账号,它只读取浏览器已保存的、且与当前 origin 匹配的凭证。如果测试时清空了浏览器密码管理器,或者域名刚换过(比如从 dev.example.com 切到 example.com),就必然拿不到结果。