Passkeys Chrome 还是 Mac 钥匙串
在代码中区分 Passkeys 是存储在 Chrome 还是 Mac 钥匙串,主要依赖于 WebAuthn API 和平台特定的 API。不同的平台有不同的实现方式,以下是一些可能的思路和示例代码。
使用 WebAuthn API 检测平台
WebAuthn API 提供了一些方法,可 以帮助你识别 Passkeys 的创建和存储位置。你可以通过查看 authenticatorAttachment 属性来区分是使用平台认证器(如 Mac 钥匙串)还是跨平台认证器(如 YubiKey)。
示例代码(JavaScript)
async function createPasskey() {
try {
const publicKeyCredentialCreationOptions = {
// 你的公钥创建选项
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions,
});
if (credential.response.attestationObject) {
const attestationObj = CBOR.decode(credential.response.attestationObject);
const authData = new Uint8Array(attestationObj.authData);
// 检查 authenticatorAttachment 属性
if (credential.authenticatorAttachment === 'platform') {
console.log('Passkey 存储在平台认证器中(例如 Mac 钥匙串)');
} else if (credential.authenticatorAttachment === 'cross-platform') {
console.log('Passkey 存储在跨平台认证器中(例如 YubiKey)');
} else {
console.log('无法确定 Passkey 的存储位置');
}
}
} catch (err) {
console.error('创建 Passkey 失败', err);
}
}
createPasskey();
检测浏览器类型
你还可以通过检测浏览器类型来确定是否在 Chrome 中运行。这可以通过 navigator.userAgent 或 navigator.vendor 属性来实现。
示例代码(JavaScript)
function isChrome() {
return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
}
function isSafari() {
return /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
}
if (isChrome()) {
console.log('运行在 Chrome 浏览器中');
// 这里可以执行与 Chrome 相关的代码
} else if (isSafari()) {
console.log('运行在 Safari 浏览器中');
// 这里可以执行与 Safari 或 Mac 钥匙串相关的代码
} else {
console.log('运行在其他浏览器中');
}
综合使用
你可以将上述两种方法结合起来,以更精确地确定 Passkeys 的存储位置。
综合示例代码
async function createAndDetectPasskey() {
function isChrome() {
return /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
}
function isSafari() {
return /Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor);
}
try {
const publicKeyCredentialCreationOptions = {
// 你的公钥创建选项
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions,
});
if (credential.response.attestationObject) {
const attestationObj = CBOR.decode(credential.response.attestationObject);
const authData = new Uint8Array(attestationObj.authData);
if (credential.authenticatorAttachment === 'platform') {
if (isSafari()) {
console.log('Passkey 存储在 Mac 钥匙串中');
} else {
console.log('Passkey 存储在平台认证器中');
}
} else if (credential.authenticatorAttachment === 'cross-platform') {
console.log('Passkey 存储在跨平台认证器中');
} else {
console.log('无法确定 Passkey 的存储位置');
}
}
} catch (err) {
console.error('创建 Passkey 失败', err);
}
}
createAndDetectPasskey();
通过上述代码,你可以更精确地确定 Passkeys 的存储位置,并根据不同的存储位置采取相应的措施。