[{"data":1,"prerenderedAt":1056},["ShallowReactive",2],{"page-\u002Fsupabase\u002Fauthentification":3,"pieces-supabase":1013,"autour-\u002Fsupabase\u002Fauthentification":1038,"prerequis-\u002Fsupabase\u002Fauthentification":1043,"plan-supabase":1045},{"id":4,"title":5,"body":6,"description":986,"extension":987,"ligne":988,"meta":989,"motsCles":990,"navigation":360,"niveau":991,"path":992,"prerequis":993,"ressources":995,"seo":1006,"sources":1007,"stem":1011,"__hash__":1012},"docs\u002Fsupabase\u002F04.authentification.md","Authentification",{"type":7,"value":8,"toc":975},"minimark",[9,14,32,36,45,52,59,63,138,148,154,158,204,207,225,234,238,497,511,522,526,540,609,649,663,667,674,768,779,785,789,796,912,923,927,971],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,29],"ul",{},[18,19,20],"li",{},"Créer un compte et se connecter avec un e-mail et un mot de passe.",[18,22,23,24,28],{},"Lire l'utilisateur connecté avec ",[25,26,27],"code",{},"useSupabaseUser",".",[18,30,31],{},"Protéger des pages pour que seuls les connectés y accèdent.",[10,33,35],{"id":34},"comment-ça-marche","Comment ça marche",[37,38,39,40,44],"p",{},"L'",[41,42,43],"strong",{},"authentification"," vérifie qui est l'utilisateur. Supabase la gère : il stocke les comptes et les mots de passe. Tu n'écris aucun code pour les conserver.",[37,46,47,48,51],{},"Après une connexion réussie, le client reçoit une ",[41,49,50],{},"session"," : la preuve que la personne est connectée. Le module Nuxt la garde dans des cookies et la renvoie à chaque requête.",[37,53,54,55,58],{},"Une session contient un ",[41,56,57],{},"JWT",", un jeton signé qui contient l'identité de la personne. La base s'en sert pour appliquer la RLS.",[10,60,62],{"id":61},"sinscrire","S'inscrire",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","const { error } = await supabase.auth.signUp({\n  email: 'cuisinier@exemple.fr',\n  password: 'un-mot-de-passe-solide',\n})\n","ts","",[25,71,72,108,121,132],{"__ignoreMap":69},[73,74,77,81,85,89,92,95,98,101,105],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"sOnC1","const",[73,82,84],{"class":83},"scfrF"," { ",[73,86,88],{"class":87},"s5iOY","error",[73,90,91],{"class":83}," } ",[73,93,94],{"class":79},"=",[73,96,97],{"class":79}," await",[73,99,100],{"class":83}," supabase.auth.",[73,102,104],{"class":103},"syCW7","signUp",[73,106,107],{"class":83},"({\n",[73,109,111,114,118],{"class":75,"line":110},2,[73,112,113],{"class":83},"  email: ",[73,115,117],{"class":116},"shWOn","'cuisinier@exemple.fr'",[73,119,120],{"class":83},",\n",[73,122,124,127,130],{"class":75,"line":123},3,[73,125,126],{"class":83},"  password: ",[73,128,129],{"class":116},"'un-mot-de-passe-solide'",[73,131,120],{"class":83},[73,133,135],{"class":75,"line":134},4,[73,136,137],{"class":83},"})\n",[37,139,140,141,143,144,147],{},"La méthode ",[25,142,104],{}," crée le compte. Dans le tableau de bord, la section ",[41,145,146],{},"Authentication"," règle si l'utilisateur doit confirmer son adresse par un e-mail avant de se connecter.",[149,150,151],"note",{},[37,152,153],{},"Si le compte existe déjà, Supabase peut renvoyer une réponse qui masque ce fait. C'est voulu : cela empêche de deviner quelles adresses sont inscrites.",[10,155,157],{"id":156},"se-connecter-et-se-déconnecter","Se connecter et se déconnecter",[64,159,161],{"className":66,"code":160,"language":68,"meta":69,"style":69},"const { error } = await supabase.auth.signInWithPassword({\n  email: 'cuisinier@exemple.fr',\n  password: 'un-mot-de-passe-solide',\n})\n",[25,162,163,184,192,200],{"__ignoreMap":69},[73,164,165,167,169,171,173,175,177,179,182],{"class":75,"line":76},[73,166,80],{"class":79},[73,168,84],{"class":83},[73,170,88],{"class":87},[73,172,91],{"class":83},[73,174,94],{"class":79},[73,176,97],{"class":79},[73,178,100],{"class":83},[73,180,181],{"class":103},"signInWithPassword",[73,183,107],{"class":83},[73,185,186,188,190],{"class":75,"line":110},[73,187,113],{"class":83},[73,189,117],{"class":116},[73,191,120],{"class":83},[73,193,194,196,198],{"class":75,"line":123},[73,195,126],{"class":83},[73,197,129],{"class":116},[73,199,120],{"class":83},[73,201,202],{"class":75,"line":134},[73,203,137],{"class":83},[37,205,206],{},"Pour se déconnecter :",[64,208,210],{"className":66,"code":209,"language":68,"meta":69,"style":69},"await supabase.auth.signOut()\n",[25,211,212],{"__ignoreMap":69},[73,213,214,217,219,222],{"class":75,"line":76},[73,215,216],{"class":79},"await",[73,218,100],{"class":83},[73,220,221],{"class":103},"signOut",[73,223,224],{"class":83},"()\n",[37,226,227,228,230,231,28],{},"Par défaut, ",[25,229,221],{}," déconnecte l'utilisateur de tous ses appareils. Pour ne fermer que la session en cours, passe ",[25,232,233],{},"{ scope: 'local' }",[10,235,237],{"id":236},"une-page-de-connexion","Une page de connexion",[64,239,244],{"className":240,"code":241,"filename":242,"language":243,"meta":69,"style":69},"language-vue shiki shiki-themes github-light-default github-dark-default github-dark-default","\u003Cscript setup lang=\"ts\">\nconst supabase = useSupabaseClient()\nconst user = useSupabaseUser()\nconst email = ref('')\nconst password = ref('')\nconst message = ref('')\n\nasync function connexion() {\n  const { error } = await supabase.auth.signInWithPassword({\n    email: email.value,\n    password: password.value\n  })\n  if (error) message.value = error.message\n}\n\nwatch(user, () => {\n  if (user.value) navigateTo('\u002Fmes-recettes')\n}, { immediate: true })\n\u003C\u002Fscript>\n","app\u002Fpages\u002Flogin.vue","vue",[25,245,246,269,284,298,319,337,355,362,377,399,405,411,417,431,437,442,457,475,487],{"__ignoreMap":69},[73,247,248,251,255,258,261,263,266],{"class":75,"line":76},[73,249,250],{"class":83},"\u003C",[73,252,254],{"class":253},"s5JFL","script",[73,256,257],{"class":87}," setup",[73,259,260],{"class":87}," lang",[73,262,94],{"class":83},[73,264,265],{"class":116},"\"ts\"",[73,267,268],{"class":83},">\n",[73,270,271,273,276,279,282],{"class":75,"line":110},[73,272,80],{"class":79},[73,274,275],{"class":87}," supabase",[73,277,278],{"class":79}," =",[73,280,281],{"class":103}," useSupabaseClient",[73,283,224],{"class":83},[73,285,286,288,291,293,296],{"class":75,"line":123},[73,287,80],{"class":79},[73,289,290],{"class":87}," user",[73,292,278],{"class":79},[73,294,295],{"class":103}," useSupabaseUser",[73,297,224],{"class":83},[73,299,300,302,305,307,310,313,316],{"class":75,"line":134},[73,301,80],{"class":79},[73,303,304],{"class":87}," email",[73,306,278],{"class":79},[73,308,309],{"class":103}," ref",[73,311,312],{"class":83},"(",[73,314,315],{"class":116},"''",[73,317,318],{"class":83},")\n",[73,320,322,324,327,329,331,333,335],{"class":75,"line":321},5,[73,323,80],{"class":79},[73,325,326],{"class":87}," password",[73,328,278],{"class":79},[73,330,309],{"class":103},[73,332,312],{"class":83},[73,334,315],{"class":116},[73,336,318],{"class":83},[73,338,340,342,345,347,349,351,353],{"class":75,"line":339},6,[73,341,80],{"class":79},[73,343,344],{"class":87}," message",[73,346,278],{"class":79},[73,348,309],{"class":103},[73,350,312],{"class":83},[73,352,315],{"class":116},[73,354,318],{"class":83},[73,356,358],{"class":75,"line":357},7,[73,359,361],{"emptyLinePlaceholder":360},true,"\n",[73,363,365,368,371,374],{"class":75,"line":364},8,[73,366,367],{"class":79},"async",[73,369,370],{"class":79}," function",[73,372,373],{"class":103}," connexion",[73,375,376],{"class":83},"() {\n",[73,378,380,383,385,387,389,391,393,395,397],{"class":75,"line":379},9,[73,381,382],{"class":79},"  const",[73,384,84],{"class":83},[73,386,88],{"class":87},[73,388,91],{"class":83},[73,390,94],{"class":79},[73,392,97],{"class":79},[73,394,100],{"class":83},[73,396,181],{"class":103},[73,398,107],{"class":83},[73,400,402],{"class":75,"line":401},10,[73,403,404],{"class":83},"    email: email.value,\n",[73,406,408],{"class":75,"line":407},11,[73,409,410],{"class":83},"    password: password.value\n",[73,412,414],{"class":75,"line":413},12,[73,415,416],{"class":83},"  })\n",[73,418,420,423,426,428],{"class":75,"line":419},13,[73,421,422],{"class":79},"  if",[73,424,425],{"class":83}," (error) message.value ",[73,427,94],{"class":79},[73,429,430],{"class":83}," error.message\n",[73,432,434],{"class":75,"line":433},14,[73,435,436],{"class":83},"}\n",[73,438,440],{"class":75,"line":439},15,[73,441,361],{"emptyLinePlaceholder":360},[73,443,445,448,451,454],{"class":75,"line":444},16,[73,446,447],{"class":103},"watch",[73,449,450],{"class":83},"(user, () ",[73,452,453],{"class":79},"=>",[73,455,456],{"class":83}," {\n",[73,458,460,462,465,468,470,473],{"class":75,"line":459},17,[73,461,422],{"class":79},[73,463,464],{"class":83}," (user.value) ",[73,466,467],{"class":103},"navigateTo",[73,469,312],{"class":83},[73,471,472],{"class":116},"'\u002Fmes-recettes'",[73,474,318],{"class":83},[73,476,478,481,484],{"class":75,"line":477},18,[73,479,480],{"class":83},"}, { immediate: ",[73,482,483],{"class":87},"true",[73,485,486],{"class":83}," })\n",[73,488,490,493,495],{"class":75,"line":489},19,[73,491,492],{"class":83},"\u003C\u002F",[73,494,254],{"class":253},[73,496,268],{"class":83},[37,498,499,500,502,503,506,507,510],{},"La page n'a pas besoin de rediriger à la main après la connexion : ",[25,501,447],{}," surveille ",[25,504,505],{},"user"," et envoie vers ",[25,508,509],{},"\u002Fmes-recettes"," dès qu'il est rempli.",[37,512,513,514,517,518,521],{},"Le formulaire HTML (deux ",[25,515,516],{},"input",", un bouton qui appelle ",[25,519,520],{},"connexion",") est celui que tu connais déjà.",[10,523,525],{"id":524},"lire-lutilisateur","Lire l'utilisateur",[37,527,528,531,532,535,536,539],{},[25,529,530],{},"useSupabaseUser()"," renvoie l'utilisateur connecté, ou ",[25,533,534],{},"null",". Dans la version 2 du module, ce n'est pas le profil complet mais les ",[41,537,538],{},"claims"," du JWT, c'est-à-dire les informations qu'il contient :",[64,541,543],{"className":240,"code":542,"language":243,"meta":69,"style":69},"\u003Ctemplate>\n  \u003Cp v-if=\"user\">Connecté : {{ user.email }}\u003C\u002Fp>\n  \u003CNuxtLink v-else to=\"\u002Flogin\">Se connecter\u003C\u002FNuxtLink>\n\u003C\u002Ftemplate>\n",[25,544,545,554,576,601],{"__ignoreMap":69},[73,546,547,549,552],{"class":75,"line":76},[73,548,250],{"class":83},[73,550,551],{"class":253},"template",[73,553,268],{"class":83},[73,555,556,559,561,564,566,569,572,574],{"class":75,"line":110},[73,557,558],{"class":83},"  \u003C",[73,560,37],{"class":253},[73,562,563],{"class":87}," v-if",[73,565,94],{"class":83},[73,567,568],{"class":116},"\"user\"",[73,570,571],{"class":83},">Connecté : {{ user.email }}\u003C\u002F",[73,573,37],{"class":253},[73,575,268],{"class":83},[73,577,578,580,583,586,589,591,594,597,599],{"class":75,"line":123},[73,579,558],{"class":83},[73,581,582],{"class":253},"NuxtLink",[73,584,585],{"class":79}," v-else",[73,587,588],{"class":87}," to",[73,590,94],{"class":83},[73,592,593],{"class":116},"\"\u002Flogin\"",[73,595,596],{"class":83},">Se connecter\u003C\u002F",[73,598,582],{"class":253},[73,600,268],{"class":83},[73,602,603,605,607],{"class":75,"line":134},[73,604,492],{"class":83},[73,606,551],{"class":253},[73,608,268],{"class":83},[610,611,612,625],"table",{},[613,614,615],"thead",{},[616,617,618,622],"tr",{},[619,620,621],"th",{},"Champ",[619,623,624],{},"Contenu",[626,627,628,639],"tbody",{},[616,629,630,636],{},[631,632,633],"td",{},[25,634,635],{},"user.sub",[631,637,638],{},"L'identifiant unique de l'utilisateur.",[616,640,641,646],{},[631,642,643],{},[25,644,645],{},"user.email",[631,647,648],{},"Son adresse.",[37,650,651,652,655,656,659,660,28],{},"L'identifiant est dans ",[25,653,654],{},"sub",", pas dans ",[25,657,658],{},"id",". Si tu as besoin de champs absents des claims, comme la date de dernière connexion, appelle ",[25,661,662],{},"supabase.auth.getUser()",[10,664,666],{"id":665},"protéger-des-pages","Protéger des pages",[37,668,669,670,673],{},"Par défaut, le module redirige vers ",[25,671,672],{},"\u002Flogin"," quiconque n'est pas connecté. Les pages publiques se déclarent dans les options :",[64,675,678],{"className":66,"code":676,"filename":677,"language":68,"meta":69,"style":69},"export default defineNuxtConfig({\n  modules: ['@nuxtjs\u002Fsupabase'],\n  supabase: {\n    redirectOptions: {\n      login: '\u002Flogin',\n      callback: '\u002Fconfirm',\n      exclude: ['\u002F', '\u002Frecettes']\n    }\n  }\n})\n","nuxt.config.ts",[25,679,680,694,707,712,717,727,737,754,759,764],{"__ignoreMap":69},[73,681,682,685,688,691],{"class":75,"line":76},[73,683,684],{"class":79},"export",[73,686,687],{"class":79}," default",[73,689,690],{"class":103}," defineNuxtConfig",[73,692,107],{"class":693},"sIXEE",[73,695,696,699,702,705],{"class":75,"line":110},[73,697,698],{"class":83},"  modules: [",[73,700,701],{"class":116},"'@nuxtjs\u002Fsupabase'",[73,703,704],{"class":83},"]",[73,706,120],{"class":693},[73,708,709],{"class":75,"line":123},[73,710,711],{"class":83},"  supabase: {\n",[73,713,714],{"class":75,"line":134},[73,715,716],{"class":83},"    redirectOptions: {\n",[73,718,719,722,725],{"class":75,"line":321},[73,720,721],{"class":83},"      login: ",[73,723,724],{"class":116},"'\u002Flogin'",[73,726,120],{"class":83},[73,728,729,732,735],{"class":75,"line":339},[73,730,731],{"class":83},"      callback: ",[73,733,734],{"class":116},"'\u002Fconfirm'",[73,736,120],{"class":83},[73,738,739,742,745,748,751],{"class":75,"line":357},[73,740,741],{"class":83},"      exclude: [",[73,743,744],{"class":116},"'\u002F'",[73,746,747],{"class":83},", ",[73,749,750],{"class":116},"'\u002Frecettes'",[73,752,753],{"class":83},"]\n",[73,755,756],{"class":75,"line":364},[73,757,758],{"class":83},"    }\n",[73,760,761],{"class":75,"line":379},[73,762,763],{"class":83},"  }\n",[73,765,766],{"class":75,"line":401},[73,767,137],{"class":693},[37,769,770,771,774,775,778],{},"La liste ",[25,772,773],{},"exclude"," contient les pages ouvertes à tous. Toutes les autres exigent une connexion. L'option ",[25,776,777],{},"include"," fait l'inverse : elle limite la protection aux routes qu'elle liste.",[780,781,782],"caution",{},[37,783,784],{},"Une redirection dans le navigateur protège l'affichage, pas les données. Une personne peut appeler l'API directement. La vraie protection est la RLS, vue au cours suivant.",[10,786,788],{"id":787},"la-page-de-confirmation","La page de confirmation",[37,790,791,792,795],{},"Quand la connexion passe par un lien (lien magique, Google, GitHub), l'utilisateur revient sur ",[25,793,794],{},"\u002Fconfirm",". Cette page attend que la session soit lue puis redirige :",[64,797,800],{"className":240,"code":798,"filename":799,"language":243,"meta":69,"style":69},"\u003Cscript setup lang=\"ts\">\nconst user = useSupabaseUser()\n\nwatch(user, () => {\n  if (user.value) return navigateTo('\u002F')\n}, { immediate: true })\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003Cdiv>Connexion en cours...\u003C\u002Fdiv>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Fconfirm.vue",[25,801,802,818,830,834,844,862,870,878,882,890,904],{"__ignoreMap":69},[73,803,804,806,808,810,812,814,816],{"class":75,"line":76},[73,805,250],{"class":83},[73,807,254],{"class":253},[73,809,257],{"class":87},[73,811,260],{"class":87},[73,813,94],{"class":83},[73,815,265],{"class":116},[73,817,268],{"class":83},[73,819,820,822,824,826,828],{"class":75,"line":110},[73,821,80],{"class":79},[73,823,290],{"class":87},[73,825,278],{"class":79},[73,827,295],{"class":103},[73,829,224],{"class":83},[73,831,832],{"class":75,"line":123},[73,833,361],{"emptyLinePlaceholder":360},[73,835,836,838,840,842],{"class":75,"line":134},[73,837,447],{"class":103},[73,839,450],{"class":83},[73,841,453],{"class":79},[73,843,456],{"class":83},[73,845,846,848,850,853,856,858,860],{"class":75,"line":321},[73,847,422],{"class":79},[73,849,464],{"class":83},[73,851,852],{"class":79},"return",[73,854,855],{"class":103}," navigateTo",[73,857,312],{"class":83},[73,859,744],{"class":116},[73,861,318],{"class":83},[73,863,864,866,868],{"class":75,"line":339},[73,865,480],{"class":83},[73,867,483],{"class":87},[73,869,486],{"class":83},[73,871,872,874,876],{"class":75,"line":357},[73,873,492],{"class":83},[73,875,254],{"class":253},[73,877,268],{"class":83},[73,879,880],{"class":75,"line":364},[73,881,361],{"emptyLinePlaceholder":360},[73,883,884,886,888],{"class":75,"line":379},[73,885,250],{"class":83},[73,887,551],{"class":253},[73,889,268],{"class":83},[73,891,892,894,897,900,902],{"class":75,"line":401},[73,893,558],{"class":83},[73,895,896],{"class":253},"div",[73,898,899],{"class":83},">Connexion en cours...\u003C\u002F",[73,901,896],{"class":253},[73,903,268],{"class":83},[73,905,906,908,910],{"class":75,"line":407},[73,907,492],{"class":83},[73,909,551],{"class":253},[73,911,268],{"class":83},[37,913,914,915,747,917,747,920,28],{},"L'adresse de retour doit être autorisée dans ",[41,916,146],{},[41,918,919],{},"URL Configuration",[41,921,922],{},"Redirect URLs",[10,924,926],{"id":925},"à-retenir","À retenir",[15,928,929,941,944,959,968],{},[18,930,931,932,934,935,937,938,940],{},"Supabase gère les comptes : ",[25,933,104],{}," crée, ",[25,936,181],{}," connecte, ",[25,939,221],{}," déconnecte.",[18,942,943],{},"La session est un JWT que le module Nuxt conserve dans des cookies.",[18,945,946,948,949,951,952,955,956,958],{},[25,947,530],{}," donne ",[25,950,654],{}," (identifiant) et ",[25,953,954],{},"email",", ou ",[25,957,534],{}," si personne n'est connecté.",[18,960,961,964,965,967],{},[25,962,963],{},"redirectOptions"," fixe la page de connexion et les pages publiques (",[25,966,773],{},").",[18,969,970],{},"Une redirection ne protège pas les données : seule la RLS le fait.",[972,973,974],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}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);}html pre.shiki code .s5JFL, html code.shiki .s5JFL{--shiki-light:#116329;--shiki-default:#7EE787;--shiki-dark:#7EE787}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}",{"title":69,"searchDepth":110,"depth":123,"links":976},[977,978,979,980,981,982,983,984,985],{"id":12,"depth":110,"text":13},{"id":34,"depth":110,"text":35},{"id":61,"depth":110,"text":62},{"id":156,"depth":110,"text":157},{"id":236,"depth":110,"text":237},{"id":524,"depth":110,"text":525},{"id":665,"depth":110,"text":666},{"id":787,"depth":110,"text":788},{"id":925,"depth":110,"text":926},"Inscrire et connecter des utilisateurs avec e-mail et mot de passe, lire la session et protéger une page.","md","supabase",{},[43,104,181,221,27,50,963,57],"intermediaire","\u002Fsupabase\u002Fauthentification",[994],"\u002Fsupabase\u002Flire-et-ecrire",[996,1000,1003],{"nom":997,"url":998,"type":999,"anglais":360},"Module Nuxt Supabase, authentification (en anglais)","https:\u002F\u002Fsupabase.nuxtjs.org\u002Fgetting-started\u002Fauthentication","doc",{"nom":1001,"url":1002,"type":999,"anglais":360},"Supabase, signUp (en anglais)","https:\u002F\u002Fsupabase.com\u002Fdocs\u002Freference\u002Fjavascript\u002Fauth-signup",{"nom":1004,"url":1005,"type":999,"anglais":360},"Supabase, signInWithPassword (en anglais)","https:\u002F\u002Fsupabase.com\u002Fdocs\u002Freference\u002Fjavascript\u002Fauth-signinwithpassword",{"title":5,"description":986},[1008,1009],{"nom":997,"url":998},{"nom":1010,"url":1002},"Supabase, référence JavaScript auth (en anglais)","supabase\u002F04.authentification","DFOsxD-6ezudREDgHpaVVESyupUzD3mWhROMgdZpBIk",[1014,1018,1022,1025,1026,1030,1034],{"path":1015,"title":1016,"stem":1017},"\u002Fsupabase\u002Fdecouvrir-supabase","Découvrir Supabase","supabase\u002F01.decouvrir-supabase",{"path":1019,"title":1020,"stem":1021},"\u002Fsupabase\u002Fbrancher-a-nuxt","Brancher Supabase à Nuxt","supabase\u002F02.brancher-a-nuxt",{"path":994,"title":1023,"stem":1024},"Lire et écrire des données","supabase\u002F03.lire-et-ecrire",{"path":992,"title":5,"stem":1011},{"path":1027,"title":1028,"stem":1029},"\u002Fsupabase\u002Frow-level-security","Row Level Security","supabase\u002F05.row-level-security",{"path":1031,"title":1032,"stem":1033},"\u002Fsupabase\u002Fstockage-et-temps-reel","Stockage et temps réel","supabase\u002F06.stockage-et-temps-reel",{"path":1035,"title":1036,"stem":1037},"\u002Fsupabase","Supabase","supabase\u002Findex",[1039,1041],{"title":1023,"path":994,"stem":1024,"description":1040,"children":-1},"Lire, ajouter, modifier et supprimer des lignes avec le client Supabase, en gérant les erreurs.",{"title":1028,"path":1027,"stem":1029,"description":1042,"children":-1},"Activer la RLS sur une table, écrire des politiques de lecture et d'écriture et comprendre pourquoi elle est indispensable avec une clé publique.",[1044],{"path":994,"title":1023,"ligne":988},[1046,1048,1049,1050,1051,1052,1054],{"path":1015,"title":1016,"niveau":1047,"stem":1017},"debutant",{"path":1019,"title":1020,"niveau":1047,"stem":1021},{"path":994,"title":1023,"niveau":1047,"stem":1024},{"path":992,"title":5,"niveau":991,"stem":1011},{"path":1027,"title":1028,"niveau":991,"stem":1029},{"path":1031,"title":1032,"niveau":1053,"stem":1033},"avance",{"path":1035,"title":1036,"niveau":1055,"stem":1037},"memo",1794583460773]