CredentialsContainer:create() 方法
create()
方法是CredentialsContainer
接口的一部分,用于创建一个新的凭据,然后可以存储该凭据,并稍后使用navigator.credentials.get()
方法检索它。然后,网站可以使用检索到的凭据来验证用户身份。
此方法支持三种不同的凭据类型
- 密码凭据,允许用户使用密码登录。
- 联合凭据,允许用户使用联合身份提供商登录。
- 公钥凭据,允许用户使用身份验证器(例如平台内置的生物识别读取器或可移动硬件令牌)登录。
请注意,联合凭据管理 API (FedCM)取代了联合凭据类型。
语法
create()
create(options)
参数
options
可选-
一个包含请求的新
Credentials
对象选项的对象。它可以包含以下属性signal
可选-
一个
AbortSignal
对象实例,允许中止正在进行的create()
操作。中止的操作可能会正常完成(通常是在收到中止请求后操作已完成时)或以“AbortError
”DOMException
拒绝。
以下每个属性都表示正在创建的凭据类型。必须指定且只能指定其中一个
federated
可选-
一个
FederatedCredentialInit
对象,包含创建联合身份提供商凭据的要求。 password
可选-
一个
PasswordCredentialInit
对象,包含创建密码凭据的要求。 publicKey
可选-
一个
PublicKeyCredentialCreationOptions
对象,包含创建公钥凭据的要求。导致create()
调用请求用户代理通过身份验证器创建新的凭据——无论是注册新帐户还是将新的非对称密钥对与现有帐户关联。注意:使用带有
publicKey
参数的create()
可能会被服务器上设置的publickey-credentials-create
权限策略阻止。
返回值
一个Promise
,它解析为以下之一
- 如果凭据类型为
federated
,则为FederatedCredential
。 - 如果凭据类型为
password
,则为PasswordCredential
。 - 如果凭据类型为
publicKey
,则为PublicKeyCredential
。
如果无法创建凭据对象,则 promise 解析为null
。
异常
TypeError
-
在
PasswordCredential
创建请求的情况下,未提供(为空)id
、origin
或password
。 NotAllowedError
DOMException
-
可能的原因包括
- 使用被
publickey-credentials-create
权限策略阻止。 - 跨源调用该函数,但 iframe 的
allow
属性未设置适当的publickey-credentials-create
策略。 - 跨源调用该函数,并且
<iframe>
没有瞬时激活。
- 使用被
AbortError
DOMException
-
操作已中止。
示例
创建密码凭据
此示例从PasswordCredentialInit
对象创建密码凭据。
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
对象创建联合凭据。
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
对象创建公钥凭据。
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
对象,提供对几个有用信息片段的访问,包括身份验证器数据、公钥、传输机制等。
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 的浏览器中加载。