[{"data":1,"prerenderedAt":699},["ShallowReactive",2],{"docs:navigation":3,"docs:page:\u002Fdocs\u002Fauthentication\u002Fuser-data":115},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Introduction","\u002Fdocs","docs\u002F1.index",[9,11,16,21,38,95,110],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-house",{"title":12,"path":13,"stem":14,"icon":15},"Quickstart","\u002Fdocs\u002Fquickstart","docs\u002F2.quickstart","i-lucide-rocket",{"title":17,"path":18,"stem":19,"icon":20},"Essentials","\u002Fdocs\u002Fconfiguration","docs\u002F3.configuration","i-lucide-book-open",{"title":22,"path":23,"stem":24,"children":25,"icon":27},"Authentication","\u002Fdocs\u002Fauthentication","docs\u002F4.authentication\u002Findex",[26,28,33],{"title":22,"path":23,"stem":24,"icon":27},"i-lucide-shield-check",{"title":29,"path":30,"stem":31,"icon":32},"Protect User Data","\u002Fdocs\u002Fauthentication\u002Fuser-data","docs\u002F4.authentication\u002F1.user-data","i-lucide-user-lock",{"title":34,"path":35,"stem":36,"icon":37},"Two-Factor Verification","\u002Fdocs\u002Fauthentication\u002Ftwo-factor","docs\u002F4.authentication\u002F2.two-factor","i-lucide-key-round",{"title":39,"path":40,"stem":41,"children":42,"icon":44},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F5.deployment\u002Findex",[43,45,50,55,60,65,70,75,80,85,90],{"title":39,"path":40,"stem":41,"icon":44},"i-lucide-cloud-upload",{"title":46,"path":47,"stem":48,"icon":49},"Deploy to Cloudflare","\u002Fdocs\u002Fdeployment\u002Fcloudflare","docs\u002F5.deployment\u002F1.cloudflare","i-simple-icons-cloudflare",{"title":51,"path":52,"stem":53,"icon":54},"Platform Support","\u002Fdocs\u002Fdeployment\u002Fsupport","docs\u002F5.deployment\u002F10.support","i-lucide-list-checks",{"title":56,"path":57,"stem":58,"icon":59},"Deploy to Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F5.deployment\u002F2.vercel","i-simple-icons-vercel",{"title":61,"path":62,"stem":63,"icon":64},"Deploy to Azure","\u002Fdocs\u002Fdeployment\u002Fazure","docs\u002F5.deployment\u002F3.azure","i-simple-icons-microsoftazure",{"title":66,"path":67,"stem":68,"icon":69},"Switch Hosts","\u002Fdocs\u002Fdeployment\u002Fswitch-hosts","docs\u002F5.deployment\u002F4.switch-hosts","i-lucide-arrow-right-left",{"title":71,"path":72,"stem":73,"icon":74},"Database and File Storage","\u002Fdocs\u002Fdeployment\u002Fdata-services","docs\u002F5.deployment\u002F5.data-services","i-lucide-database",{"title":76,"path":77,"stem":78,"icon":79},"Domains and Secrets","\u002Fdocs\u002Fdeployment\u002Fsettings","docs\u002F5.deployment\u002F6.settings","i-lucide-settings",{"title":81,"path":82,"stem":83,"icon":84},"Troubleshoot Deployment","\u002Fdocs\u002Fdeployment\u002Ftroubleshooting","docs\u002F5.deployment\u002F7.troubleshooting","i-lucide-wrench",{"title":86,"path":87,"stem":88,"icon":89},"Deploy Agents","\u002Fdocs\u002Fdeployment\u002Fagents","docs\u002F5.deployment\u002F8.agents","i-lucide-bot",{"title":91,"path":92,"stem":93,"icon":94},"Deploy Automations","\u002Fdocs\u002Fdeployment\u002Fautomations","docs\u002F5.deployment\u002F9.automations","i-lucide-workflow",{"title":96,"path":97,"stem":98,"children":99,"icon":101},"Connect Accounts","\u002Fdocs\u002Fconnect","docs\u002F6.connect\u002Findex",[100,102,106],{"title":96,"path":97,"stem":98,"icon":101},"i-lucide-plug",{"title":103,"path":104,"stem":105,"icon":37},"Connection Credentials","\u002Fdocs\u002Fconnect\u002Fcredentials","docs\u002F6.connect\u002F1.credentials",{"title":107,"path":108,"stem":109,"icon":84},"Connect MCP Servers","\u002Fdocs\u002Fconnect\u002Fmcp","docs\u002F6.connect\u002F2.mcp",{"title":111,"path":112,"stem":113,"icon":114},"Project Reference","\u002Fdocs\u002Freference","docs\u002F7.reference","i-lucide-terminal",{"page":116,"surround":694},{"id":117,"title":29,"body":118,"description":687,"extension":688,"links":689,"meta":690,"navigation":691,"path":30,"seo":692,"stem":31,"__hash__":693},"docs\u002Fdocs\u002F4.authentication\u002F1.user-data.md",{"type":119,"value":120,"toc":683},"minimark",[121,130,135,138,556,559,570,574,581,668,679],[122,123,124,125,129],"p",{},"This guide assumes ",[126,127,128],"a",{"href":23},"sign-in is working",". A session tells\nCloudConfig who made a request; model rules decide which rows they can access.",[131,132,134],"h2",{"id":133},"protect-data-that-belongs-to-a-user","Protect Data That Belongs to a User",[122,136,137],{},"Relate the model to the built-in user model. Mark the owner as server-only so a\nbrowser cannot assign or change ownership. A creation hook fills it from the\nsession after the access check:",[139,140,145],"pre",{"className":141,"code":142,"language":143,"meta":144,"style":144},"language-ts shiki shiki-themes github-light github-light github-dark","note: model(\n  {\n    title: t.text().required(),\n    owner: t.relation('user').required().serverOnly(),\n  },\n  {\n    access: {\n      list: ({ user, where }) =>\n        user ? where('ownerId', 'eq', user.id) : false,\n      read: ({ user, where }) =>\n        user ? where('ownerId', 'eq', user.id) : false,\n      create: ({ user }) => user != null,\n      update: ({ user, where }) =>\n        user ? where('ownerId', 'eq', user.id) : false,\n      delete: ({ user, where }) =>\n        user ? where('ownerId', 'eq', user.id) : false,\n    },\n    hooks: {\n      beforeCreate: ({ user }, input) => {\n        if (!user) throw new Error('Sign-in required')\n        return { ...input, ownerId: user.id }\n      },\n    },\n  },\n)\n","ts","",[146,147,148,167,173,191,219,225,230,236,262,297,315,340,366,384,409,427,452,458,464,488,520,535,541,546,551],"code",{"__ignoreMap":144},[149,150,153,157,161,164],"span",{"class":151,"line":152},"line",1,[149,154,156],{"class":155},"snPdu","note",[149,158,160],{"class":159},"sxrX7",": ",[149,162,163],{"class":155},"model",[149,165,166],{"class":159},"(\n",[149,168,170],{"class":151,"line":169},2,[149,171,172],{"class":159},"  {\n",[149,174,176,179,182,185,188],{"class":151,"line":175},3,[149,177,178],{"class":159},"    title: t.",[149,180,181],{"class":155},"text",[149,183,184],{"class":159},"().",[149,186,187],{"class":155},"required",[149,189,190],{"class":159},"(),\n",[149,192,194,197,200,203,207,210,212,214,217],{"class":151,"line":193},4,[149,195,196],{"class":159},"    owner: t.",[149,198,199],{"class":155},"relation",[149,201,202],{"class":159},"(",[149,204,206],{"class":205},"sIIMD","'user'",[149,208,209],{"class":159},").",[149,211,187],{"class":155},[149,213,184],{"class":159},[149,215,216],{"class":155},"serverOnly",[149,218,190],{"class":159},[149,220,222],{"class":151,"line":221},5,[149,223,224],{"class":159},"  },\n",[149,226,228],{"class":151,"line":227},6,[149,229,172],{"class":159},[149,231,233],{"class":151,"line":232},7,[149,234,235],{"class":159},"    access: {\n",[149,237,239,242,245,249,252,255,258],{"class":151,"line":238},8,[149,240,241],{"class":155},"      list",[149,243,244],{"class":159},": ({ ",[149,246,248],{"class":247},"sP4rz","user",[149,250,251],{"class":159},", ",[149,253,254],{"class":247},"where",[149,256,257],{"class":159}," }) ",[149,259,261],{"class":260},"s8jYJ","=>\n",[149,263,265,268,271,274,276,279,281,284,287,290,294],{"class":151,"line":264},9,[149,266,267],{"class":159},"        user ",[149,269,270],{"class":260},"?",[149,272,273],{"class":155}," where",[149,275,202],{"class":159},[149,277,278],{"class":205},"'ownerId'",[149,280,251],{"class":159},[149,282,283],{"class":205},"'eq'",[149,285,286],{"class":159},", user.id) ",[149,288,289],{"class":260},":",[149,291,293],{"class":292},"sBjJW"," false",[149,295,296],{"class":159},",\n",[149,298,300,303,305,307,309,311,313],{"class":151,"line":299},10,[149,301,302],{"class":155},"      read",[149,304,244],{"class":159},[149,306,248],{"class":247},[149,308,251],{"class":159},[149,310,254],{"class":247},[149,312,257],{"class":159},[149,314,261],{"class":260},[149,316,318,320,322,324,326,328,330,332,334,336,338],{"class":151,"line":317},11,[149,319,267],{"class":159},[149,321,270],{"class":260},[149,323,273],{"class":155},[149,325,202],{"class":159},[149,327,278],{"class":205},[149,329,251],{"class":159},[149,331,283],{"class":205},[149,333,286],{"class":159},[149,335,289],{"class":260},[149,337,293],{"class":292},[149,339,296],{"class":159},[149,341,343,346,348,350,352,355,358,361,364],{"class":151,"line":342},12,[149,344,345],{"class":155},"      create",[149,347,244],{"class":159},[149,349,248],{"class":247},[149,351,257],{"class":159},[149,353,354],{"class":260},"=>",[149,356,357],{"class":159}," user ",[149,359,360],{"class":260},"!=",[149,362,363],{"class":292}," null",[149,365,296],{"class":159},[149,367,369,372,374,376,378,380,382],{"class":151,"line":368},13,[149,370,371],{"class":155},"      update",[149,373,244],{"class":159},[149,375,248],{"class":247},[149,377,251],{"class":159},[149,379,254],{"class":247},[149,381,257],{"class":159},[149,383,261],{"class":260},[149,385,387,389,391,393,395,397,399,401,403,405,407],{"class":151,"line":386},14,[149,388,267],{"class":159},[149,390,270],{"class":260},[149,392,273],{"class":155},[149,394,202],{"class":159},[149,396,278],{"class":205},[149,398,251],{"class":159},[149,400,283],{"class":205},[149,402,286],{"class":159},[149,404,289],{"class":260},[149,406,293],{"class":292},[149,408,296],{"class":159},[149,410,412,415,417,419,421,423,425],{"class":151,"line":411},15,[149,413,414],{"class":155},"      delete",[149,416,244],{"class":159},[149,418,248],{"class":247},[149,420,251],{"class":159},[149,422,254],{"class":247},[149,424,257],{"class":159},[149,426,261],{"class":260},[149,428,430,432,434,436,438,440,442,444,446,448,450],{"class":151,"line":429},16,[149,431,267],{"class":159},[149,433,270],{"class":260},[149,435,273],{"class":155},[149,437,202],{"class":159},[149,439,278],{"class":205},[149,441,251],{"class":159},[149,443,283],{"class":205},[149,445,286],{"class":159},[149,447,289],{"class":260},[149,449,293],{"class":292},[149,451,296],{"class":159},[149,453,455],{"class":151,"line":454},17,[149,456,457],{"class":159},"    },\n",[149,459,461],{"class":151,"line":460},18,[149,462,463],{"class":159},"    hooks: {\n",[149,465,467,470,472,474,477,480,483,485],{"class":151,"line":466},19,[149,468,469],{"class":155},"      beforeCreate",[149,471,244],{"class":159},[149,473,248],{"class":247},[149,475,476],{"class":159}," }, ",[149,478,479],{"class":247},"input",[149,481,482],{"class":159},") ",[149,484,354],{"class":260},[149,486,487],{"class":159}," {\n",[149,489,491,494,497,500,503,506,509,512,514,517],{"class":151,"line":490},20,[149,492,493],{"class":260},"        if",[149,495,496],{"class":159}," (",[149,498,499],{"class":260},"!",[149,501,502],{"class":159},"user) ",[149,504,505],{"class":260},"throw",[149,507,508],{"class":260}," new",[149,510,511],{"class":155}," Error",[149,513,202],{"class":159},[149,515,516],{"class":205},"'Sign-in required'",[149,518,519],{"class":159},")\n",[149,521,523,526,529,532],{"class":151,"line":522},21,[149,524,525],{"class":260},"        return",[149,527,528],{"class":159}," { ",[149,530,531],{"class":260},"...",[149,533,534],{"class":159},"input, ownerId: user.id }\n",[149,536,538],{"class":151,"line":537},22,[149,539,540],{"class":159},"      },\n",[149,542,544],{"class":151,"line":543},23,[149,545,457],{"class":159},[149,547,549],{"class":151,"line":548},24,[149,550,224],{"class":159},[149,552,554],{"class":151,"line":553},25,[149,555,519],{"class":159},[122,557,558],{},"These rules apply to REST requests and the typed client. Requests without a\nsession receive no private rows.",[122,560,561,562,565,566,569],{},"After adding the relation or user fields, generate and apply a migration with\n",[146,563,564],{},"pnpm db:generate"," and ",[146,567,568],{},"pnpm db:migrate",".",[131,571,573],{"id":572},"add-fields-to-a-user","Add Fields to a User",[122,575,576,577,580],{},"Use ",[146,578,579],{},"userFields"," when access rules need application-specific information:",[139,582,584],{"className":141,"code":583,"language":143,"meta":144,"style":144},"auth: {\n  providers: { github: true },\n  userFields: {\n    role: t.select(['member', 'admin']).default('member').hidden(),\n  },\n}\n",[146,585,586,594,613,620,659,663],{"__ignoreMap":144},[149,587,588,591],{"class":151,"line":152},[149,589,590],{"class":155},"auth",[149,592,593],{"class":159},": {\n",[149,595,596,599,602,605,607,610],{"class":151,"line":169},[149,597,598],{"class":155},"  providers",[149,600,601],{"class":159},": { ",[149,603,604],{"class":155},"github",[149,606,160],{"class":159},[149,608,609],{"class":292},"true",[149,611,612],{"class":159}," },\n",[149,614,615,618],{"class":151,"line":175},[149,616,617],{"class":155},"  userFields",[149,619,593],{"class":159},[149,621,622,625,628,631,634,637,639,642,645,648,650,652,654,657],{"class":151,"line":193},[149,623,624],{"class":155},"    role",[149,626,627],{"class":159},": t.",[149,629,630],{"class":155},"select",[149,632,633],{"class":159},"([",[149,635,636],{"class":205},"'member'",[149,638,251],{"class":159},[149,640,641],{"class":205},"'admin'",[149,643,644],{"class":159},"]).",[149,646,647],{"class":155},"default",[149,649,202],{"class":159},[149,651,636],{"class":205},[149,653,209],{"class":159},[149,655,656],{"class":155},"hidden",[149,658,190],{"class":159},[149,660,661],{"class":151,"line":221},[149,662,224],{"class":159},[149,664,665],{"class":151,"line":227},[149,666,667],{"class":159},"}\n",[122,669,670,671,674,675,678],{},"The field is included in the next migration and becomes available as\n",[146,672,673],{},"user.role",". The ",[146,676,677],{},".hidden()"," modifier prevents sign-up requests from assigning\nthe field themselves.",[680,681,682],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP4rz, html code.shiki .sP4rz{--shiki-light:#E36209;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":144,"searchDepth":169,"depth":169,"links":684},[685,686],{"id":133,"depth":169,"text":134},{"id":572,"depth":169,"text":573},"Limit private rows to their owner and add application-specific user fields.","md",null,{},{"icon":32},{"title":29,"description":687},"2EvkN9jN-teDaihNK_OZ7PjqlzyyOM0Q0u6uVa9T48A",[695,697],{"title":22,"path":23,"stem":24,"description":696,"icon":27},"Let users sign in with GitHub and identify them in your access rules.",{"title":34,"path":35,"stem":36,"description":698,"icon":37},"Require an email code or a passkey after primary sign-in.",1792122403757]