大多数浏览器和
Developer App 均支持流媒体播放。
-
利用通行密钥升级和凭证管理器简化登录体验
了解如何将基于密码的现有账户自动升级为使用通行密钥。我们将介绍提升账户安全性并简化登录体验的重要意义和实现途径、适用于凭证管理器 App 的新功能,以及如何将你的 App 信息充分整合到新的“密码”App 中。
章节
- 0:00 - Introduction
- 0:38 - Automatic passkey upgrades
- 2:37 - The passkey journey
- 4:18 - Automatic passkey upgrade sequence
- 7:46 - Shipping and deploying passkey support
- 9:17 - Improvements for credential managers
- 10:14 - The new Passwords app!
- 11:30 - Updating appearance in the Passwords app
- 12:31 - One-tap verification code setup
资源
- About the security of passkeys
- ASCredentialProviderExtensionCapabilities
- Authentication Services
- Connecting to a service with passkeys
- Forum: Privacy & Security
- Passkeys overview
- Public-Private Key Authentication
- Supporting passkeys
相关视频
WWDC23
WWDC22
WWDC21
-
下载Array
-
-
0:01 - Offering a passkey upsell
// Offering a passkey upsell func signIn() async throws { let userInfo = try await signInWithPassword() guard !userInfo.hasPasskey else { return } let provider = ASAuthorizationPlatformPublicKeyCredentialProvider( relyingPartyIdentifier: "example.com") guard try offerPasskeyUpsell() else { return } let request = provider.createCredentialRegistrationRequest( challenge: try await fetchChallenge(), name: userInfo.user, userID: userInfo.accountID) do { let passkey = try await authorizationController.performRequest(request) // Save new passkey to the backend } catch { … } }
-
0:02 - Automatic passkey upgrade
// Automatic passkey upgrade func signIn() async throws { let userInfo = try await signInWithPassword() guard !userInfo.hasPasskey else { return } let provider = ASAuthorizationPlatformPublicKeyCredentialProvider( relyingPartyIdentifier: "example.com") let request = provider.createCredentialRegistrationRequest( challenge: try await fetchChallenge(), name: userInfo.user, userID: userInfo.accountID, requestStyle: .conditional) do { let passkey = try await authorizationController.performRequest(request) // Save new passkey to the backend } catch { … } }
-
0:03 - Modal passkey creation (web)
// Modal passkey creation const options = { "publicKey": { "rp": { … }, "user": { "name": userInfo.user, … }, "challenge": …, "pubKeyCredParams": [ … ] }, }; await navigator.credentials.create(options);
-
0:04 - Automatic passkey creation (web)
// Automatic passkey creation let capabilities = await PublicKeyCredential.getClientCapabilities(); if (!capabilities.conditionalCreate) { return; } const options = { "publicKey": { "rp": { … }, "user": { "name": userInfo.user, … }, "challenge": …, "pubKeyCredParams": [ … ] }, "mediation": "conditional" }; await navigator.credentials.create(options);
-
0:05 - New Credential provider Info.plist keys
<dict> <key>NSExtensionAttributes</key> <dict> <key>ASCredentialProviderExtensionCapabilities</key> <dict> <key>ProvidesPasswords</key> <true/> <key>ProvidesPasskeys</key> <true/> <key>SupportsConditionalPasskeyRegistration</key> <true/> <key>ProvidesOneTimeCodes</key> <true/> <key>ProvidesTextToInsert</key> <true/> </dict> </dict> </dict>
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。