[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"url-settings":86,"blog-\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website":663,"blog-author-\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website":1214,"i-material-symbols:arrow-back-rounded":1226},{"id":4,"extension":5,"footer":6,"header":73,"meta":83,"stem":84,"__hash__":85},"navigation\u002Fdata\u002Fshared\u002Fnavigation.yml","yml",{"brand":7,"columns":13,"legal":63},{"name":8,"tagline":9,"downloadCta":10},"Pieces","The memory layer for modern work.",{"label":11,"href":12},"All downloads","\u002Fdownloads",[14,26,39,51],{"title":15,"links":16},"Product",[17,20,23],{"label":18,"href":19},"Pieces Desktop","\u002F",{"label":21,"href":22},"Pieces Enterprise","\u002Fenterprise",{"label":24,"href":25},"Pieces MCP","\u002Fmcp",{"title":27,"links":28},"Resources",[29,33,36],{"label":30,"href":31,"external":32},"Documentation","url:docs.home",true,{"label":34,"href":35},"Blog","\u002Fblog",{"label":37,"href":38,"external":32},"GitHub","url:github.org",{"title":40,"links":41},"Community",[42,45,48],{"label":43,"href":44,"external":32},"Discord","url:social.discord",{"label":46,"href":47,"external":32},"X \u002F Twitter","url:social.x",{"label":49,"href":50,"external":32},"LinkedIn","url:social.linkedin",{"title":52,"links":53},"Company",[54,57,60],{"label":55,"href":56},"About","\u002Fabout",{"label":58,"href":59},"Updates","\u002Fupdates",{"label":61,"href":62},"Contact","\u002Fcontact",[64,67,70],{"label":65,"href":66},"Privacy Policy","\u002Flegal\u002Fprivacy",{"label":68,"href":69},"Refund Policy","\u002Flegal\u002Frefund",{"label":71,"href":72},"Terms of Service","\u002Flegal\u002Fterms",{"links":74,"signIn":75,"contact":78,"cta":80},[],{"label":76,"href":77},"Sign in","url:portal.home",{"label":79,"href":62},"Get in touch",{"label":81,"href":82},"Download","url:routes.downloads",{},"data\u002Fshared\u002Fnavigation","VdirGIa8cUm6xLprbBeTKcw914JfyJjWfF-9hSVOX5Y",{"id":87,"extension":5,"links":88,"meta":660,"stem":661,"__hash__":662},"urlSettings\u002Fdata\u002Fshared\u002Furls.yml",[89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,295,299,303,306,310,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,453,457,461,465,469,473,477,480,483,486,489,493,497,500,504,508,512,516,520,524,528,532,536,540,544,548,551,555,559,563,567,571,574,577,580,584,587,591,595,599,603,606,610,614,617,620,623,627,631,635,638,641,644,648,652,656],{"key":90,"label":91,"href":92},"downloads.desktop","Desktop download page","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdownload",{"key":94,"label":95,"href":96},"downloads.macOS.dmgArm64","macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg-arm64\u002Fdownload",{"key":98,"label":99,"href":100},"downloads.macOS.dmgIntel","macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg\u002Fdownload",{"key":102,"label":103,"href":104},"downloads.macOS.pkg","macOS PKG","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg\u002Fdownload",{"key":106,"label":107,"href":108},"downloads.macOS.universal","Desktop macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fmacos-universal\u002Fdownload",{"key":110,"label":111,"href":112},"downloads.macOS.pkgArm64","Desktop macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd-arm64\u002Fdownload",{"key":114,"label":115,"href":116},"downloads.macOS.pkgIntel","Desktop macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd\u002Fdownload",{"key":118,"label":119,"href":120},"downloads.windows.appinstaller","Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fpieces_for_x.appinstaller",{"key":122,"label":123,"href":124},"downloads.windows.exe","Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-exe\u002Fdownload",{"key":126,"label":127,"href":128},"downloads.windows.msix","Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-msix\u002Fdownload",{"key":130,"label":131,"href":132},"downloads.windows.suiteManager","Windows Suite Manager","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_suite_windows\u002Fappinstaller\u002Fdownload",{"key":134,"label":135,"href":136},"downloads.linux.flatpakRepo","Linux Flatpak repository","https:\u002F\u002Fbuilds.pieces.app\u002Fpieces-flatpak-repo\u002Fpieces-flatpak.flatpakrepo",{"key":138,"label":139,"href":140},"downloads.linux.snapDesktop","Linux Snap Desktop","https:\u002F\u002Fsnapcraft.io\u002Fpieces-for-developers",{"key":142,"label":143,"href":144},"downloads.linux.snapPiecesOS","Linux Snap PiecesOS","https:\u002F\u002Fsnapcraft.io\u002Fpieces-os",{"key":146,"label":147,"href":148},"downloads.linux.snap","Desktop Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fsnap\u002Fdownload",{"key":150,"label":151,"href":152},"downloads.piecesOS.macOS.dmgArm64","PiecesOS macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg-arm64\u002Fdownload",{"key":154,"label":155,"href":156},"downloads.piecesOS.macOS.dmgIntel","PiecesOS macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg\u002Fdownload",{"key":158,"label":159,"href":160},"downloads.piecesOS.macOS.universal","PiecesOS macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fmacos-universal\u002Fdownload",{"key":162,"label":163,"href":164},"downloads.piecesOS.macOS.pkgArm64","PiecesOS macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only-arm64\u002Fdownload",{"key":166,"label":167,"href":168},"downloads.piecesOS.macOS.pkgIntel","PiecesOS macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only\u002Fdownload",{"key":170,"label":171,"href":172},"downloads.piecesOS.windows.appinstaller","PiecesOS Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fos_server.appinstaller",{"key":174,"label":175,"href":176},"downloads.piecesOS.windows.exe","PiecesOS Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-exe\u002Fdownload",{"key":178,"label":179,"href":180},"downloads.piecesOS.windows.msix","PiecesOS Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-msix\u002Fdownload",{"key":182,"label":183,"href":184},"downloads.piecesOS.linux.snap","PiecesOS Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fsnap\u002Fdownload",{"key":186,"label":187,"href":188},"downloads.combined.macOS.appleSilicon","Combined macOS installer Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-arm64\u002Fdownload",{"key":190,"label":191,"href":104},"downloads.combined.macOS.intel","Combined macOS installer Intel",{"key":193,"label":194,"href":195},"downloads.guides.macOS","macOS installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fmacos-installation-guide",{"key":197,"label":198,"href":199},"downloads.guides.windows","Windows installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fwindows-installation-guide",{"key":201,"label":202,"href":203},"downloads.guides.linux","Linux installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide",{"key":205,"label":206,"href":207},"downloads.guides.piecesOS","PiecesOS manual installation","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fmanual-installation",{"key":209,"label":210,"href":211},"extensions.chrome","Chrome extension","https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fpieces-save-code-snippets\u002Figbgibhbfonhmjlechmeefimncpekepm",{"key":213,"label":214,"href":215},"extensions.firefox","Firefox add-on","https:\u002F\u002Faddons.mozilla.org\u002Fen-US\u002Ffirefox\u002Faddon\u002Fpieces-save-code-from-the-web\u002F",{"key":217,"label":218,"href":219},"extensions.edge","Edge add-on","https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fpieces-save-code-snippet\u002Fhglfimcdgonaeeobjckfdabcldfidmim",{"key":221,"label":222,"href":223},"extensions.vscode","VS Code extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.pieces-vscode",{"key":225,"label":226,"href":227},"extensions.visualStudio","Visual Studio extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.PiecesVisualStudio",{"key":229,"label":230,"href":231},"extensions.jetbrains","JetBrains plugin","https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F17328-pieces--save-search-share--reuse-code-snippets",{"key":233,"label":234,"href":235},"extensions.obsidian","Obsidian plugin","https:\u002F\u002Fobsidian.md\u002Fplugins?id=pieces-for-developers",{"key":237,"label":238,"href":239},"extensions.sublime","Sublime package","https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FPieces",{"key":241,"label":242,"href":243},"extensions.neovim","Neovim plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neo_vim",{"key":245,"label":246,"href":247},"extensions.jupyterlab","JupyterLab plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fjupyterlab-pieces",{"key":249,"label":250,"href":251},"extensions.cli","Pieces CLI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpieces-cli\u002F",{"key":253,"label":254,"href":255},"docs.home","Documentation home","https:\u002F\u002Fdocs.pieces.app",{"key":257,"label":258,"href":259},"docs.getStarted","Get started docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces",{"key":261,"label":262,"href":263},"docs.api","API docs","https:\u002F\u002Fdocs.pieces.app\u002Fapi",{"key":265,"label":266,"href":267},"docs.desktop.overview","Desktop overview","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop",{"key":269,"label":270,"href":271},"docs.desktop.onboarding","Desktop onboarding","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fonboarding",{"key":273,"label":274,"href":275},"docs.desktop.timeline","Desktop timeline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Ftimeline",{"key":277,"label":278,"href":279},"docs.desktop.summaries","Desktop summaries docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fsingle-click-summaries",{"key":281,"label":282,"href":283},"docs.desktop.search","Desktop conversational search docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconversational-search",{"key":285,"label":286,"href":287},"docs.desktop.drive","Desktop drive docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdrive",{"key":289,"label":290,"href":291},"docs.desktop.account","Desktop account settings docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconfiguration\u002Faccount",{"key":293,"label":294,"href":92},"docs.desktop.download","Desktop download docs",{"key":296,"label":297,"href":298},"docs.piecesOS.overview","PiecesOS overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies",{"key":300,"label":301,"href":302},"docs.piecesOS.details","PiecesOS details docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os",{"key":304,"label":305,"href":207},"docs.piecesOS.install","PiecesOS install docs",{"key":307,"label":308,"href":309},"docs.piecesOS.quickMenu","PiecesOS quick menu docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fquick-menu",{"key":311,"label":312,"href":313},"docs.piecesOS.storage","On-device storage docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fon-device-storage",{"key":315,"label":316,"href":317},"docs.piecesOS.troubleshooting","PiecesOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Ftroubleshooting",{"key":319,"label":320,"href":321},"docs.mcp.overview","MCP overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp",{"key":323,"label":324,"href":325},"docs.mcp.cursor","MCP Cursor docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcursor",{"key":327,"label":328,"href":329},"docs.mcp.vscode","MCP VS Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fvs-code",{"key":331,"label":332,"href":333},"docs.mcp.claudeDesktop","MCP Claude Desktop docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-desktop",{"key":335,"label":336,"href":337},"docs.mcp.claudeCode","MCP Claude Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-code",{"key":339,"label":340,"href":341},"docs.mcp.claudeCowork","MCP Claude Cowork docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-cowork",{"key":343,"label":344,"href":345},"docs.mcp.githubCopilot","MCP GitHub Copilot docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgithub-copilot",{"key":347,"label":348,"href":349},"docs.mcp.goose","MCP Goose docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoose",{"key":351,"label":352,"href":353},"docs.mcp.windsurf","MCP Windsurf docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fwindsurf",{"key":355,"label":356,"href":357},"docs.mcp.zed","MCP Zed docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fzed",{"key":359,"label":360,"href":361},"docs.mcp.jetbrains","MCP JetBrains docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fjetbrains-ides",{"key":363,"label":364,"href":365},"docs.mcp.continueDev","MCP Continue docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcontinue-dev",{"key":367,"label":368,"href":369},"docs.mcp.cline","MCP Cline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcline",{"key":371,"label":372,"href":373},"docs.mcp.raycast","MCP Raycast docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fraycast",{"key":375,"label":376,"href":377},"docs.mcp.rovoDevCli","MCP Rovo Dev CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Frovo-dev-cli",{"key":379,"label":380,"href":381},"docs.mcp.openaiCodexCli","MCP OpenAI Codex CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenai-codex-cli",{"key":383,"label":384,"href":385},"docs.mcp.googleGeminiCli","MCP Google Gemini CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoogle-gemini-cli",{"key":387,"label":388,"href":389},"docs.mcp.amazonQ","MCP Amazon Q docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Famazon-q-developer",{"key":391,"label":392,"href":393},"docs.mcp.chatgptDev","MCP ChatGPT Developer Mode docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fchatgpt-developer-mode",{"key":395,"label":396,"href":397},"docs.mcp.openclaw","MCP OpenClaw docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenclaw",{"key":399,"label":400,"href":401},"docs.mcp.mcpRemote","MCP Remote docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fmcp-remote",{"key":403,"label":404,"href":405},"docs.mcp.ngrok","MCP ngrok docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fngrok-setup",{"key":407,"label":408,"href":409},"docs.troubleshooting.macOS","macOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fmacos",{"key":411,"label":412,"href":413},"docs.troubleshooting.windows","Windows troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fwindows",{"key":415,"label":416,"href":417},"docs.troubleshooting.linux","Linux troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Flinux",{"key":419,"label":420,"href":421},"docs.privacy","Privacy and security docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fprivacy-security-your-data",{"key":423,"label":424,"href":425},"docs.support","Support docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fsupport",{"key":427,"label":428,"href":429},"portal.home","Pieces portal","https:\u002F\u002Fportal.pieces.app",{"key":431,"label":432,"href":433},"site.home","Website home","https:\u002F\u002Fpieces.app",{"key":435,"label":436,"href":437},"site.about","About page","https:\u002F\u002Fpieces.app\u002Fabout",{"key":439,"label":440,"href":441},"site.features","Features page","https:\u002F\u002Fpieces.app\u002Ffeatures",{"key":443,"label":444,"href":445},"site.plugins","Plugins page","https:\u002F\u002Fpieces.app\u002Fplugins",{"key":447,"label":448,"href":449},"site.contact","Contact page","https:\u002F\u002Fpieces.app\u002Fcontact",{"key":451,"label":58,"href":452},"site.updates","https:\u002F\u002Fpieces.app\u002Fupdates",{"key":454,"label":455,"href":456},"site.news","News","https:\u002F\u002Fpieces.app\u002Fnews",{"key":458,"label":459,"href":460},"site.events","Community events","https:\u002F\u002Fpieces.app\u002Fcommunity\u002Fevents",{"key":462,"label":463,"href":464},"site.userStories","User stories","https:\u002F\u002Fpieces.app\u002Fuser-stories",{"key":466,"label":467,"href":468},"site.academy","Academy","https:\u002F\u002Fpieces.app\u002Flearn\u002Facademy",{"key":470,"label":471,"href":472},"site.support","Website support","https:\u002F\u002Fpieces.app\u002Fsupport",{"key":474,"label":475,"href":476},"site.standup","Standup","https:\u002F\u002Fpieces.app\u002Fstandup",{"key":478,"label":34,"href":479},"site.blog","https:\u002F\u002Fcode.pieces.app\u002Fblog",{"key":481,"label":43,"href":482},"social.discord","https:\u002F\u002Fdiscord.gg\u002Fgetpieces",{"key":484,"label":46,"href":485},"social.x","https:\u002F\u002Fx.com\u002Fgetpieces",{"key":487,"label":488,"href":485},"social.twitter","Twitter",{"key":490,"label":491,"href":492},"social.instagram","Instagram","https:\u002F\u002Fwww.instagram.com\u002Fgetpieces\u002F",{"key":494,"label":495,"href":496},"social.tiktok","TikTok","https:\u002F\u002Fwww.tiktok.com\u002F@getpieces",{"key":498,"label":49,"href":499},"social.linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fgetpieces\u002F",{"key":501,"label":502,"href":503},"social.youtube","YouTube","https:\u002F\u002Fyoutube.com\u002F@getpieces",{"key":505,"label":506,"href":507},"github.org","GitHub organization","https:\u002F\u002Fgithub.com\u002Fpieces-app",{"key":509,"label":510,"href":511},"github.support","GitHub support","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport",{"key":513,"label":514,"href":515},"github.issues","GitHub issues","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fissues",{"key":517,"label":518,"href":519},"github.discussions","GitHub discussions","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fdiscussions",{"key":521,"label":522,"href":523},"github.documentation","GitHub documentation","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fdocumentation",{"key":525,"label":526,"href":527},"github.opensource","GitHub open source","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fopensource",{"key":529,"label":530,"href":531},"github.sdks.python","Python SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-python",{"key":533,"label":534,"href":535},"github.sdks.typescript","TypeScript SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-typescript",{"key":537,"label":538,"href":539},"github.sdks.dart","Dart SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-dart",{"key":541,"label":542,"href":543},"github.sdks.kotlin","Kotlin SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-kotlin",{"key":545,"label":546,"href":547},"github.plugins.obsidian","Obsidian plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fobsidian-pieces",{"key":549,"label":550,"href":247},"github.plugins.jupyterlab","JupyterLab plugin repository",{"key":552,"label":553,"href":554},"github.plugins.sublime","Sublime plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_sublime",{"key":556,"label":557,"href":558},"github.plugins.neovim","Neovim plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neovim",{"key":560,"label":561,"href":562},"github.cliAgent","CLI agent repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fcli-agent",{"key":564,"label":565,"href":566},"github.mcpDart","MCP Dart repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fmcp_dart",{"key":568,"label":569,"href":570},"github.awesomePieces","Awesome Pieces repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fawesome-pieces",{"key":572,"label":573,"href":66},"legal.privacyPolicy","Privacy policy",{"key":575,"label":576,"href":69},"legal.refundPolicy","Refund policy",{"key":578,"label":579,"href":72},"legal.terms","Terms",{"key":581,"label":582,"href":583},"legal.security","Legal security","https:\u002F\u002Fpieces.app\u002Flegal\u002Fsecurity",{"key":585,"label":586,"href":503},"videos.youtubeChannel","YouTube channel",{"key":588,"label":589,"href":590},"videos.gettingStartedDesktop","Getting started desktop video","https:\u002F\u002Fyoutu.be\u002FdUr1lRM_TYk",{"key":592,"label":593,"href":594},"videos.snippetDiscoveryxR","Snippet discovery video","https:\u002F\u002Fyoutu.be\u002FG6vb1USw-30",{"key":596,"label":597,"href":598},"sales.bookACall","Book a sales call","https:\u002F\u002Fcalendar.app.google\u002FWVUDtUfNy5Vst3sH7",{"key":600,"label":601,"href":602},"sales.enterprise","Enterprise form","https:\u002F\u002Fgetpieces.typeform.com\u002Fto\u002FaVQFTvpE",{"key":604,"label":605,"href":519},"sales.feedback","Feedback discussions",{"key":607,"label":608,"href":609},"sales.earlyAccess","Early access form","https:\u002F\u002Fgetpieces.typeform.com\u002Fearlyaccess",{"key":611,"label":612,"href":613},"sales.supportEmail","Support email","mailto:support@pieces.app",{"key":615,"label":616,"href":19},"routes.home","Home route",{"key":618,"label":619,"href":56},"routes.about","About route",{"key":621,"label":622,"href":12},"routes.downloads","Downloads route",{"key":624,"label":625,"href":626},"routes.thanks","Post-install thanks route","\u002Finstall\u002Fthanks",{"key":628,"label":629,"href":630},"routes.pricing","Pricing route","\u002Fpricing",{"key":632,"label":633,"href":634},"cta.freeTrial","Start free trial CTA (Pieces Pro) — used by \u002Fcampaigns\u002F* landing pages","https:\u002F\u002Fcampaigns.pieces.app\u002F",{"key":636,"label":637,"href":22},"routes.enterprise","Enterprise route",{"key":639,"label":640,"href":62},"routes.contact","Contact route",{"key":642,"label":643,"href":59},"routes.updates","Updates route",{"key":645,"label":646,"href":647},"routes.migrationError","Migration error route","\u002Fmigration\u002Ferror",{"key":649,"label":650,"href":651},"routes.authenticated","Post-login authenticated route","\u002Fauth\u002Fsigned-in",{"key":653,"label":654,"href":655},"routes.signed-out","Signed out route","\u002Fauth\u002Fsigned-out",{"key":657,"label":658,"href":659},"routes.authentication-error","Authentication error route","\u002Fauth\u002Ferror",{},"data\u002Fshared\u002Furls","NLkVE1lIUws518K-1QsSB6T-GvlXYIzcRL1HDhqarGQ",{"id":664,"title":665,"author":666,"authorPhoto":667,"authorPhotoAlt":668,"authorSlug":669,"body":670,"buttonText":668,"buttonUrl":668,"category":1200,"date":1201,"description":1202,"draft":1203,"editorsPick":1203,"extension":1204,"featured":1203,"image":1205,"imageAlt":1206,"meta":1207,"navigation":32,"ogImage":668,"ogImageAlt":668,"path":1208,"seo":1209,"stem":1210,"tags":1211,"__hash__":1213},"blog\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website.md","Integrating the “Sign in with Apple” Feature into your Website","Paul Rosset","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website\u002Fauthor.jpeg",null,"paul-rosset",{"type":671,"value":672,"toc":1184},"minimark",[673,677,680,683,688,691,694,701,712,733,736,740,743,746,754,757,761,764,769,772,778,788,791,844,847,865,869,872,878,886,893,908,912,922,925,935,938,944,952,959,962,1028,1034,1042,1045,1051,1054,1058,1061,1064,1067,1073,1076,1082,1085,1091,1098,1101,1105,1108,1118,1121,1124,1130,1137,1140,1143,1146,1171,1174,1178,1181],[674,675,676],"p",{},"Most of the time, users will have to provide email and password combinations that tend to be less and less secure over time, as hackers are constantly inventing new ways to breach users’ accounts through social engineering and other methods.",[674,678,679],{},"Moreover, integrating an authentication flow inside an app is redundant and requires a lot of effort. That’s why major companies like Apple or Google, with which many people have an account, are creating ways to authenticate users for you. This method is also more secure because both companies have developed methods to ensure your account remains safe, and they have the resources to keep it secure.",[674,681,682],{},"In this article, we’ll look at how we can integrate Apple authentication into our web app that’s only based on the client side with JSON Web Token integration passed to the back-end.",[684,685,687],"h2",{"id":686},"sdk-loading","SDK Loading",[674,689,690],{},"We’ll use the SDK provided by Apple.",[674,692,693],{},"To use the SDK, we must first download it. It's a JavaScript library that will live on the page's window object once downloaded through a",[695,696,697],"ul",{},[698,699,700],"li",{},"Javascript based loading",[702,703,708],"pre",{"className":704,"code":706,"language":707},[705],"language-text","await loadScript(\"\")\n","text",[709,710,706],"code",{"__ignoreMap":711},"",[674,713,714,715,718,719,726,727,732],{},"Note that the implementation of the ",[709,716,717],{},"loadScript()"," function can be found in the following ",[720,721,725],"a",{"href":722,"rel":723},"https:\u002F\u002Fgist.github.com\u002FPaulRosset\u002F4f51b1206ff368f3f0cb59a7ad3e28a3",[724],"nofollow","gist"," or at the following ",[720,728,731],{"href":729,"rel":730},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=ae8d4983b2",[724],"Pieces link",".",[674,734,735],{},"The Apple SDK is now loaded. Thanks to the window object, we can use it anywhere in our app.",[684,737,739],{"id":738},"implementation","Implementation",[674,741,742],{},"Apple provides very detailed documentation, which is helpful, especially for knowing the data types that methods return.",[674,744,745],{},"The documentation is available at this address:",[695,747,748],{},[698,749,750],{},[720,751,752],{"href":752,"rel":753},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fsign_in_with_apple_js",[724],[674,755,756],{},"The other pro of Apple SDK is that it provides a very flexible SDK that will allow anyone to design their button as their wish.",[684,758,760],{"id":759},"using-sdk-to-authenticate-users","Using SDK to Authenticate Users",[674,762,763],{},"The good news is that it’s straightforward to set up in terms of code.",[765,766,768],"h3",{"id":767},"initialization","Initialization()",[674,770,771],{},"The first thing we need to do is to implement the init method:",[702,773,776],{"className":774,"code":775,"language":707},[705],"window.AppleID.auth.init({\n clientId : 'myapp.myapp.signin',\n scope : 'email name',\n redirectURI : window.location.origin,\n state : 'SignInUserAuthenticationRequest',\n usePopup : true\n});\n",[709,777,775],{"__ignoreMap":711},[674,779,780],{},[720,781,784],{"href":782,"rel":783},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=546c4bb5c1",[724],[785,786,787],"em",{},"Click to save this command to Pieces",[674,789,790],{},"Here, we passed several important fields:",[695,792,793,802,814,823,831],{},[698,794,795,798,799,801],{},[709,796,797],{},"clientId"," → The ",[709,800,797],{}," is the identifier that will help Apple identify the request to the Apple app you created. To get it from Apple, you must go through several steps we will define in the next section.",[698,803,804,798,807,809,810,813],{},[709,805,806],{},"scope",[709,808,806],{}," is essential. You can ask Apple to return the name or\u002Fand email of the user that got authenticated. However, it is also important to specify it as Apple will also insert it inside the payload of the ",[709,811,812],{},"JsonWebToken"," that we’ll use to auth the user. It’s also handy for the backend, which will create the user in the database with an email associated.",[698,815,816,819,820,822],{},[709,817,818],{},"redirectURI"," → Apple uses the ",[709,821,818],{}," to redirect users once they have finished the authentication process. You must pass the same URL that you will specify in the Apple console.",[698,824,825,798,828,830],{},[709,826,827],{},"state",[709,829,827],{}," is a property for security. It’s a gentle way to identify the request. It allows the client to check that the request you get back from Apple is the one expected. For example, you can put whatever you want in that field, and when you get back the auth request from the user, the field will also be present. You can assert that the field is the same as you initially sent in order to ensure that someone has not tricked you.",[698,832,833,836,837,839,840,843],{},[709,834,835],{},"usePopup","→ The ",[709,838,835],{}," feature is explicit. By using ",[709,841,842],{},"true"," here, it tells Apple to create a new browser window to authenticate the user. This property seems relatively straightforward, but can lead to inconsistency when used in a WebView environment. We’ll return to this later.",[674,845,846],{},"As stated previously, you can find the interface and the method at the following URL:",[695,848,849,857],{},[698,850,851,856],{},[720,852,855],{"href":853,"rel":854},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fclientconfigi",[724],"ClientConfigI"," interface",[698,858,859,864],{},[720,860,863],{"href":861,"rel":862},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fauthi\u002F3230945-init",[724],"Init()"," method",[765,866,868],{"id":867},"sign-in","Sign-in()",[674,870,871],{},"Once we initialize the SDK, we need to create a button that will react to a click event and start the Apple authentication flow:",[702,873,876],{"className":874,"code":875,"language":707},[705],"button.addEventListener('click', async () => {\n await window.AppleID.auth.signIn();\n});\n",[709,877,875],{"__ignoreMap":711},[674,879,880],{},[720,881,884],{"href":882,"rel":883},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=15ac48b3a6",[724],[785,885,787],{},[674,887,888,889,892],{},"Here, the ",[709,890,891],{},"signIn()"," method will trigger a popup where users will be able to enter their credentials. During that phase, we no longer control anything. It's Apple's job.",[695,894,895],{},[698,896,897,904,905],{},[720,898,901],{"href":899,"rel":900},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fauthi\u002F3261300-signin",[724],[902,903,891],"strong",{}," ",[902,906,907],{},"method",[684,909,911],{"id":910},"listening-to-success-and-error-events-to-authenticate-users","Listening to Success and Error Events to Authenticate Users",[674,913,914,915,917,918,921],{},"At the end of the flow, Apple needs to give back control with the ",[709,916,812],{}," of the authenticated user. To achieve that, the SDK will emit a ",[709,919,920],{},"CustomEvent"," in the DOM.",[674,923,924],{},"It’s our job to listen to those events and react in consequence.",[674,926,927,928,931,932,732],{},"We need to handle two events: ",[709,929,930],{},"success"," and ",[709,933,934],{},"error",[765,936,937],{"id":930},"Success",[702,939,942],{"className":940,"code":941,"language":707},[705],"document.addEventListener(\"AppleIDSignInOnSuccess\", this._onAppleSignInOnSuccess);\n_onAppleSignInOnSuccess(event) {\n const { state } = event.detail.authorization;\n const { email, name } = event.detail.user;\n \u002F\u002F We are checking that the request we send matches the one we receive.\n if (state === \"SignInUserAuthenticationRequest\") {\n  const { code, id_token } = event.detail.authorization;\n               \u002F\u002F Do something with id_token and code...\n \u002F\u002F User details email, name...\n} else {\n  this.onError(new Error('state property is not the one expected'));\n }\n}\n",[709,943,941],{"__ignoreMap":711},[674,945,946],{},[720,947,950],{"href":948,"rel":949},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=a70e48b2a6",[724],[785,951,787],{},[674,953,954,955,958],{},"Here, we’re listening to the ",[709,956,957],{},"AppleIDSignInOnSuccess"," event that Apple triggers when the user successfully authenticates.",[674,960,961],{},"Apple gives back multiples elements:",[695,963,964,1025],{},[698,965,966,971,972],{},[720,967,970],{"href":968,"rel":969},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fsigninresponsei",[724],"SignInResponseI"," Class",[695,973,974,1007],{},[698,975,976,977,856,982],{},"authorization ",[720,978,981],{"href":979,"rel":980},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fauthorizationi",[724],"AuthorizationI",[695,983,984,993,998],{},[698,985,986,988,989,992],{},[709,987,827],{}," → Do you remember? It’s the one we passed earlier in the ",[720,990,855],{"href":853,"rel":991},[724]," interface. The condition makes sure that we receive the one we sent earlier.",[698,994,995,997],{},[709,996,709],{}," → A single-use authorization code.",[698,999,1000,1003,1004,1006],{},[709,1001,1002],{},"id_token"," → This is the most precious piece of information we get back from Apple here. We will use the ",[709,1005,812],{}," to authenticate the user on the Back-end.",[698,1008,1009,1010,856,1017],{},"user ",[720,1011,1014],{"href":1012,"rel":1013},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fuseri",[724],[902,1015,1016],{},"UserI",[695,1018,1019,1022],{},[698,1020,1021],{},"email",[698,1023,1024],{},"name",[698,1026,1027],{},"Error",[702,1029,1032],{"className":1030,"code":1031,"language":707},[705],"document.addEventListener(\"AppleIDSignInOnFailure\", this._onAppleSignInOnFailure);\n_onAppleSignInOnFailure(event) {\n let { error } = event.detail;\n this.onError(new Error(error));\n}\n",[709,1033,1031],{"__ignoreMap":711},[674,1035,1036],{},[720,1037,1040],{"href":1038,"rel":1039},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=b1c7488afb",[724],[785,1041,787],{},[674,1043,1044],{},"We get back an error from Apple when, for some reason, the user did not successfully register. Errors rarely happen because if the user enters the wrong credentials, the error will be on Apple's side and not ours. Note that when the user closes the popup explicitly, Apple triggers an error:",[702,1046,1049],{"className":1047,"code":1048,"language":707},[705],"popup_closed_by_user\n",[709,1050,1048],{"__ignoreMap":711},[674,1052,1053],{},"In your perception, it may not be a proper error, but a potential situation to leverage tracking, for example.",[684,1055,1057],{"id":1056},"setting-up-an-app-through-the-apple-developer-interface","Setting up an App Through the Apple Developer Interface",[674,1059,1060],{},"Now, we’ll look at the essential configuration we have to set up to correctly use the “Sign in with Apple” feature.",[674,1062,1063],{},"You first need an Apple developer account. To have it, you need to pay a subscription to Apple, which is $100 per year.",[674,1065,1066],{},"The setup is available at this page:",[674,1068,1069],{},[720,1070,1071],{"href":1071,"rel":1072},"https:\u002F\u002Fdeveloper.apple.com\u002Faccount\u002F",[724],[674,1074,1075],{},"You can follow the video below:",[674,1077,1078],{},[720,1079,1080],{"href":1080,"rel":1081},"https:\u002F\u002Fyoutu.be\u002F9J5vgxspMhQ",[724],[674,1083,1084],{},"The crucial part is the identifier highlighted at the end of the video:",[702,1086,1089],{"className":1087,"code":1088,"language":707},[705],"com.example.signin.test.with.apple.identifier\n",[709,1090,1088],{"__ignoreMap":711},[674,1092,1093,1094,732],{},"That identifier is mandatory to have and use as the ",[720,1095,797],{"href":1096,"rel":1097},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fclientconfigi\u002F3230948-clientid",[724],[674,1099,1100],{},"The domains, subdomains, and return URLs are also essential, as your application won’t work if you don’t specify the URL it will run on. Indeed, many misconfigurations can lead to hours of debugging.",[684,1102,1104],{"id":1103},"potential-issues-experienced-while-developing","Potential Issues Experienced While Developing",[674,1106,1107],{},"This section will cover issues you could encounter, hopefully saving you time.",[674,1109,1110,1111,1113,1114,1117],{},"In the previous section, we configured the app, so we made sure that Apple would know that the following ",[709,1112,797],{},": ",[709,1115,1116],{},"com.example.signin.test.with.apple.identifier"," has the information needed to work correctly.",[674,1119,1120],{},"Again, that information is critical because a problem with this configuration alone could prevent your app from working.",[674,1122,1123],{},"When we integrated the \"Sign-in with Apple\" feature, we needed to make sure that it would work inside a WebView. Since the app is misconfigured, though, the Apple SDK was returning an error from the error event with the following payload:",[702,1125,1128],{"className":1126,"code":1127,"language":707},[705],"popup_closed_by_browser\n",[709,1129,1127],{"__ignoreMap":711},[674,1131,1132,1133,732],{},"The error was not too explicit, so we thought it was related to the property we specified: ",[720,1134,835],{"href":1135,"rel":1136},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fsign_in_with_apple\u002Fclientconfigi\u002F3530376-usepopup",[724],[674,1138,1139],{},"So, we tried to set it to false, and it worked since the error was gone. However, the misconfiguration triggered another error on the Apple side. The redirect URL parameter was misconfigured at that time, so we went to the developer tools interface and configured the correct redirects. Then, we thought that everything would work, but it wasn’t the case. Apple was reloading the page because of the misuse of the property usePopup. So, we went back to this property to set it to true – that time with the correct configuration – and finally, it worked.",[674,1141,1142],{},"To debug the WebView inside the app, we used Safari and the IOS simulator inside XCode.",[674,1144,1145],{},"Here are the steps for debugging:",[1147,1148,1149,1152,1155,1168],"ol",{},[698,1150,1151],{},"Open Safari → Click on Safari on the top left bar → Preferences → Tick the checkbox “Show Develop menu in the menu bar.”",[698,1153,1154],{},"Then, head to XCode, and create a new IOS project from Storyboard. Insert the following code into the ViewController file:",[698,1156,1157,1161,1162],{},[720,1158,1159],{"href":1159,"rel":1160},"https:\u002F\u002Fgist.github.com\u002FPaulRosset\u002Fcea982e09d09e609679b7e848e397674",[724]," or the following Pieces link: ",[720,1163,1166],{"href":1164,"rel":1165},"https:\u002F\u002F3863d558-45a9-40e6-9dff-136019435fd6.pieces.cloud\u002F?p=5e8440bf8a",[724],[785,1167,787],{},[698,1169,1170],{},"Once you’ve built and started the project inside the simulator, you can return to Safari. At the top of the screen in the top bar, click “Develop.” You should see the simulator devices appearing. Click on your simulator, and finally, click on the WebView to spawn the Safari developer tool.",[674,1172,1173],{},"This tip for debugging is only for IOS WebView usage. However, having an environment where the developer is comfortable debugging is essential.",[684,1175,1177],{"id":1176},"conclusion","Conclusion",[674,1179,1180],{},"Integrating a social provider into a front-end app is a pleasant experience for a developer. The spread of social provider integrations will likely be appreciated by developers.",[674,1182,1183],{},"A social provider simplifies the authentication step, which can be redundant for users. Hence, easing it will contribute to a positive user experience by eliminating the need to complete the email\u002Fpassword + email confirmation step. This also eliminates the need to remember passwords and removes the associated challenges, thus improving the signup and sign-in user experience.",{"title":711,"searchDepth":1185,"depth":1185,"links":1186},2,[1187,1188,1189,1194,1197,1198,1199],{"id":686,"depth":1185,"text":687},{"id":738,"depth":1185,"text":739},{"id":759,"depth":1185,"text":760,"children":1190},[1191,1193],{"id":767,"depth":1192,"text":768},3,{"id":867,"depth":1192,"text":868},{"id":910,"depth":1185,"text":911,"children":1195},[1196],{"id":930,"depth":1192,"text":937},{"id":1056,"depth":1185,"text":1057},{"id":1103,"depth":1185,"text":1104},{"id":1176,"depth":1185,"text":1177},"Software Development","2022-12-28T00:00:00.000Z","In this article, we’ll look at how we can sign in with Apple in our web app. This will make it easier for users to create unique, secure accounts.",false,"md","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website\u002Fhero.jpeg","decorative cover image showing black and white code",{},"\u002Fblog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website",{"title":665,"description":1202},"blog\u002Fintegrating-the-sign-in-with-apple-feature-into-your-website",[1212],"authentication","Uhqca8wDwht6wCtEMea8oPkDZN-9uL2KnPlMq3g8Utk",{"id":1215,"title":666,"body":1216,"description":711,"draft":1203,"extension":1204,"meta":1220,"navigation":32,"path":1221,"photo":1222,"photoAlt":668,"seo":1223,"stem":1224,"__hash__":1225},"authors\u002Fauthors\u002Fpaul-rosset.md",{"type":671,"value":1217,"toc":1218},[],{"title":711,"searchDepth":1185,"depth":1185,"links":1219},[],{},"\u002Fauthors\u002Fpaul-rosset","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fauthors\u002Fpaul-rosset.jpg",{"title":666,"description":711},"authors\u002Fpaul-rosset","H1n25f_vlYeM3vz-kTxSyEi38aEc4sxsnGVx02LvzBA",{"left":1227,"top":1227,"width":1228,"height":1228,"rotate":1227,"vFlip":1203,"hFlip":1203,"body":1229},0,24,"\u003Cpath fill=\"currentColor\" d=\"m7.825 13l4.9 4.9q.3.3.288.7t-.313.7q-.3.275-.7.288t-.7-.288l-6.6-6.6q-.15-.15-.213-.325T4.426 12t.063-.375t.212-.325l6.6-6.6q.275-.275.688-.275t.712.275q.3.3.3.713t-.3.712L7.825 11H19q.425 0 .713.288T20 12t-.288.713T19 13z\"\u002F>"]