CredentialsContainer:create() 方法

安全上下文:此功能仅在安全上下文(HTTPS)中可用,在某些或所有支持的浏览器中可用。

create()方法是CredentialsContainer接口的一部分,用于创建一个新的凭据,然后可以存储该凭据,并稍后使用navigator.credentials.get()方法检索它。然后,网站可以使用检索到的凭据来验证用户身份。

此方法支持三种不同的凭据类型

  • 密码凭据,允许用户使用密码登录。
  • 联合凭据,允许用户使用联合身份提供商登录。
  • 公钥凭据,允许用户使用身份验证器(例如平台内置的生物识别读取器或可移动硬件令牌)登录。

请注意,联合凭据管理 API (FedCM)取代了联合凭据类型。

语法

js
create()
create(options)

参数

options 可选

一个包含请求的新 Credentials 对象选项的对象。它可以包含以下属性

signal 可选

一个AbortSignal对象实例,允许中止正在进行的create()操作。中止的操作可能会正常完成(通常是在收到中止请求后操作已完成时)或以“AbortErrorDOMException拒绝。

以下每个属性都表示正在创建的凭据类型。必须指定且只能指定其中一个

federated 可选

一个FederatedCredentialInit对象,包含创建联合身份提供商凭据的要求。

password 可选

一个PasswordCredentialInit对象,包含创建密码凭据的要求。

publicKey 可选

一个PublicKeyCredentialCreationOptions对象,包含创建公钥凭据的要求。导致create()调用请求用户代理通过身份验证器创建新的凭据——无论是注册新帐户还是将新的非对称密钥对与现有帐户关联。

注意:使用带有publicKey参数的create()可能会被服务器上设置的publickey-credentials-create权限策略阻止。

返回值

一个Promise,它解析为以下之一

如果无法创建凭据对象,则 promise 解析为null

异常

TypeError

PasswordCredential创建请求的情况下,未提供(为空)idoriginpassword

NotAllowedError DOMException

可能的原因包括

AbortError DOMException

操作已中止。

示例

创建密码凭据

此示例从PasswordCredentialInit对象创建密码凭据。

js
const credInit = {
  id: "1234",
  name: "Serpentina",
  origin: "https://example.org",
  password: "the last visible dog",
};

const makeCredential = document.querySelector("#make-credential");

makeCredential.addEventListener("click", async () => {
  const cred = await navigator.credentials.create({
    password: credInit,
  });
  console.log(cred.name);
  // Serpentina
  console.log(cred.password);
  // the last visible dog
});

创建联合凭据

此示例从FederatedCredentialInit对象创建联合凭据。

js
const credInit = {
  id: "1234",
  name: "Serpentina",
  origin: "https://example.org",
  protocol: "openidconnect",
  provider: "https://provider.example.org",
};

const makeCredential = document.querySelector("#make-credential");

makeCredential.addEventListener("click", async () => {
  const cred = await navigator.credentials.create({
    federated: credInit,
  });
  console.log(cred.name);
  console.log(cred.provider);
});

创建公钥凭据

此示例从PublicKeyCredentialCreationOptions对象创建公钥凭据。

js
const publicKey = {
  challenge: challengeFromServer,
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe",
  },
  pubKeyCredParams: [{ type: "public-key", alg: -7 }],
};

const publicKeyCredential = await navigator.credentials.create({ publicKey });

如果create()调用成功,则返回一个 promise,该 promise 解析为一个PublicKeyCredential对象实例,表示稍后可用于通过 WebAuthn get()调用验证用户的公钥凭据。其PublicKeyCredential.response属性包含一个AuthenticatorAttestationResponse对象,提供对几个有用信息片段的访问,包括身份验证器数据、公钥、传输机制等。

js
navigator.credentials.create({ publicKey }).then((publicKeyCredential) => {
  const response = publicKeyCredential.response;

  // Access attestationObject ArrayBuffer
  const attestationObj = response.attestationObject;

  // Access client JSON
  const clientJSON = response.clientDataJSON;

  // Return authenticator data ArrayBuffer
  const authenticatorData = response.getAuthenticatorData();

  // Return public key ArrayBuffer
  const pk = response.getPublicKey();

  // Return public key algorithm identifier
  const pkAlgo = response.getPublicKeyAlgorithm();

  // Return permissible transports array
  const transports = response.getTransports();
});

其中一些数据需要存储在服务器上,以便将来针对此凭据进行身份验证操作——例如公钥、使用的算法和允许的传输方式。

注意:有关整个流程的工作原理的更多信息,请参阅创建密钥对并注册用户

规范

规范
凭据管理级别 1
# dom-credentialscontainer-create

浏览器兼容性

BCD 表仅在启用 JavaScript 的浏览器中加载。