Skip to main content

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 的存储位置,并根据不同的存储位置采取相应的措施。