[{"data":1,"prerenderedAt":1095},["ShallowReactive",2],{"blog-de-unsupported-provider-provider-is-not-enabled":3,"blog-index-de":564},{"id":4,"title":5,"body":6,"category":522,"cover":523,"coverAlt":524,"description":525,"draft":526,"extension":527,"faq":528,"image":544,"keywords":545,"meta":552,"navigation":553,"ogTitle":554,"path":555,"published":556,"seo":557,"stem":558,"tldr":559,"updated":556,"__hash__":563},"blog_de\u002Fblog\u002Funsupported-provider-provider-is-not-enabled.md","Supabase-Fehler: \"Unsupported provider: provider is not enabled\"",{"type":7,"value":8,"toc":511},"minimark",[9,13,24,31,38,41,46,49,52,84,87,96,102,106,109,120,124,133,155,171,205,223,226,311,315,318,335,350,364,367,372,376,379,385,409,416,420,423,432,446,455,475,479,499],[10,11,12],"p",{},"Du baust einen Knopf \"Mit Google anmelden\" in deine App ein und drückst ihn.\nStatt der Kontoauswahl von Google zeigt dein Browser das hier:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\"code\":400,\"error_code\":\"validation_failed\",\"msg\":\"Unsupported provider: provider is not enabled\"}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26,27,30],{},"In der Adressleiste steht dein Supabase-Projekt, etwa\n",[21,28,29],{},"https:\u002F\u002Fabcdefghij.supabase.co\u002Fauth\u002Fv1\u002Fauthorize?provider=google&redirect_to=…",".\nDu hast die App mit Lovable, Bolt, v0, Cursor, Claude Code oder Replit gebaut,\nder Knopf kam mit dem Code, und in diesem Code sieht nichts falsch aus.",[10,32,33,34,37],{},"\"Unsupported provider: provider is not enabled\" heißt: Supabase Auth, der Teil\nvon Supabase, der Leute anmeldet, hat Google in dem Projekt ausgeschaltet, mit\ndem deine App redet. Die Lösung ist ein Schalter und zwei Werte, die du von\nGoogle bekommst. Danach prüft Google eine eigene Liste, und von dieser Liste\nkommt der nächste Fehler, ",[21,35,36],{},"redirect_uri_mismatch",".",[10,39,40],{},"Die Falle steckt in dieser zweiten Liste. Die Adresse, die sich dort richtig\nanfühlt, ist die deiner eigenen App, und Google benutzt sie nie, weil Google\nniemanden zu deiner App schickt.",[42,43,45],"h2",{"id":44},"was-bedeutet-unsupported-provider-provider-is-not-enabled","Was bedeutet \"Unsupported provider: provider is not enabled\"?",[10,47,48],{},"Es bedeutet, dass Supabase sich geweigert hat, eine Anmeldung mit Google zu\nbeginnen, weil Google in dem Projekt ausgeschaltet ist, das die Anfrage bekommen\nhat.",[10,50,51],{},"Die Anmeldung mit Google ist eine Rundreise über zwei Empfangstresen. Deine App\nschickt die Person zum Tresen von Supabase. Supabase schickt sie weiter zum\nTresen von Google, wo sie zeigt, wer sie ist, Google schickt sie zurück zu\nSupabase, und Supabase schickt sie angemeldet nach Hause zu deiner App. Jeder\nTresen schickt Leute nur dorthin, wo seine eigenen Einstellungen es erlauben.\nDiese Meldung ist der Tresen von Supabase, der sagt, dass sein Google-Schalter\ngeschlossen ist.",[10,53,54,55,62,63,66,67,70,71,74,75,78,79,37],{},"Im\n",[56,57,61],"a",{"href":58,"rel":59},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fapi\u002Fexternal.go",[60],"nofollow","Quellcode","\nvon Supabase Auth schlägt eine Anfrage an ",[21,64,65],{},"\u002Fauth\u002Fv1\u002Fauthorize"," zuerst den\nAnbieter nach, und jedes Problem damit kommt als 400 zurück, mit dem Code\n",[21,68,69],{},"validation_failed"," und ",[21,72,73],{},"Unsupported provider:"," vor dem Grund.\n",[21,76,77],{},"provider is not enabled"," ist\n",[56,80,83],{"href":81,"rel":82},"https:\u002F\u002Fgithub.com\u002Fsupabase\u002Fauth\u002Fblob\u002Fmaster\u002Finternal\u002Fconf\u002Fconfiguration.go",[60],"das Erste, was diese Prüfung ansieht",[10,85,86],{},"Google hat die Anfrage also nie gesehen, und nichts in der Konsole von Google\nwird sie erklären. Deine App sieht den Fehler auch nicht: Die JavaScript-Bibliothek\nvon Supabase schickt den ganzen Browser zu dieser Adresse, die Seite, die\nscheitert, gehört also Supabase, und die Konsole deiner App bleibt leer.",[10,88,89,90,95],{},"Dieselbe Meldung kommt bei GitHub, Apple oder jedem anderen Anbieter, der\nausgeschaltet ist, und der Schalter sitzt an derselben Stelle. Apps auf dem\neingebauten Backend von Lovable sind anders eingerichtet: Die\n",[56,91,94],{"href":92,"rel":93},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fauthentication",[60],"Doku zur Authentifizierung","\nvon Lovable führt Google als \"managed by Lovable with no setup, or your own\nGoogle Cloud OAuth credentials.\" Dieser Beitrag ist für Apps auf deinem eigenen\nSupabase-Projekt, egal mit welchem Werkzeug sie gebaut sind.",[97,98],"diagram",{"alt":99,"caption":100,"src":101},"Ein Browser verlässt eine App und erreicht Supabase, wo der Google-Schalter aus ist. Der Weg weiter zu Google ist gestrichelt und durchgestrichen, und eine 400 geht zurück an den Browser.","Supabase antwortet, bevor Google gefragt wird. Der Fehler ist also der von Supabase, und die Lösung liegt bei Supabase.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fwhere-it-stops-1600x760.png",[42,103,105],{"id":104},"ist-es-das-richtige-supabase-projekt","Ist es das richtige Supabase-Projekt?",[10,107,108],{},"Prüf das, bevor du etwas änderst, denn die Fehlerseite nennt das Projekt, das\ngeantwortet hat.",[10,110,111,112,115,116,119],{},"Die Adresse auf der Fehlerseite beginnt mit der Referenz deines Projekts, der\nBuchstabenfolge vor ",[21,113,114],{},".supabase.co",". Öffne dein Supabase-Dashboard und sieh in\nseine eigene Adressleiste: Dieselbe Referenz steht hinter ",[21,117,118],{},"\u002Fproject\u002F",". Weichen\ndie beiden ab, redet deine App mit einem anderen Projekt, etwa einem, das ein\nBuilder für dich angelegt hat, oder einer Kopie, die du zum Testen gemacht hast.\nIn diesem Projekt muss Google eingeschaltet werden.",[42,121,123],{"id":122},"so-behebst-du-unsupported-provider-provider-is-not-enabled","So behebst du \"Unsupported provider: provider is not enabled\"",[10,125,126,127,132],{},"Leg bei Google einen OAuth-Client an und schalte dann Google in Supabase mit den\nzwei Werten ein, die du von dort bekommst. Supabases\n",[56,128,131],{"href":129,"rel":130},"https:\u002F\u002Fsupabase.com\u002Fdocs\u002Fguides\u002Fauth\u002Fsocial-login\u002Fauth-google",[60],"Anleitung zur Anmeldung mit Google","\nhat die Schritte; hier stehen sie in der Reihenfolge, in der die beiden Konsolen\ndanach fragen. Die Bezeichnungen sind die englischen aus beiden Oberflächen.",[10,134,135,139,140,143,144,147,148,151,152,37],{},[136,137,138],"strong",{},"In Supabase zuerst die Callback-URL kopieren."," Geh zu ",[136,141,142],{},"Authentication",", dann\n",[136,145,146],{},"Sign In \u002F Providers",", und öffne ",[136,149,150],{},"Google",". Dort steht eine Callback URL mit\neinem Knopf zum Kopieren. Sie sieht so aus:\n",[21,153,154],{},"https:\u002F\u002F\u003Cproject-ref>.supabase.co\u002Fauth\u002Fv1\u002Fcallback",[10,156,157,160,161,166,167,170],{},[136,158,159],{},"In Google Cloud den Client anlegen."," Leg auf der Seite\n",[56,162,165],{"href":163,"rel":164},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fclients",[60],"Clients"," der Google Auth Platform\neine OAuth-Client-ID vom Typ ",[136,168,169],{},"Web application"," an.",[172,173,174,185,192],"ul",{},[175,176,177,178,181,182,37],"li",{},"Trag unter ",[136,179,180],{},"Authorized JavaScript origins"," die Adresse deiner App ein, etwa ",[21,183,184],{},"https:\u002F\u002Fyourapp.com",[175,186,187,188,191],{},"Füg unter ",[136,189,190],{},"Authorized redirect URIs"," die Callback-URL ein, die du bei Supabase kopiert hast.",[175,193,194,195,198,199,204],{},"Drück ",[136,196,197],{},"Create"," und kopier die Client ID und das Client Secret sofort. Googles ",[56,200,203],{"href":201,"rel":202},"https:\u002F\u002Fsupport.google.com\u002Fcloud\u002Fanswer\u002F15549257",[60],"Hilfeseite zu OAuth-Clients"," warnt: \"you will only be able to view and download the full client secret once, at the time of its creation.\"",[10,206,207,210,211,214,215,218,219,222],{},[136,208,209],{},"Zurück in Supabase einschalten."," Schalte ",[136,212,213],{},"Enable Sign in with Google"," ein,\nfüg die Client ID unter ",[136,216,217],{},"Client IDs"," und das Secret unter ",[136,220,221],{},"Client Secret (for\nOAuth)"," ein und speichere. Ohne Client ID speichert das Dashboard Google nicht\nals eingeschaltet, mit leerem Secret-Feld aber schon. Die Beschreibung dieses\nFelds sagt, das Secret sei für \"the OAuth flow on the web\", und ein Knopf in\neiner Web-App ist genau dieser Ablauf.",[10,224,225],{},"Drück dann deinen Knopf noch einmal. Beginnt die Meldung immer noch mit\n\"Unsupported provider\", sagt ihr Ende, was noch fehlt:",[227,228,229,245],"table",{},[230,231,232],"thead",{},[233,234,235,239,242],"tr",{},[236,237,238],"th",{},"Die Meldung endet auf",[236,240,241],{},"Was es heißt",[236,243,244],{},"Was du änderst",[246,247,248,261,274,291],"tbody",{},[233,249,250,255,258],{},[251,252,253],"td",{},[21,254,77],{},[251,256,257],{},"Google ist in dem Projekt aus, das geantwortet hat",[251,259,260],{},"In diesem Projekt einschalten",[233,262,263,268,271],{},[251,264,265],{},[21,266,267],{},"missing OAuth client ID",[251,269,270],{},"Google ist an, aber ohne gespeicherte Client ID",[251,272,273],{},"Die Client ID einfügen",[233,275,276,281,284],{},[251,277,278],{},[21,279,280],{},"missing OAuth secret",[251,282,283],{},"Google ist an, und das Feld für das Secret ist leer",[251,285,286,287,290],{},"Das Secret einfügen, oder bei Google am Client ",[136,288,289],{},"Add Secret"," drücken, wenn du es nicht mehr hast",[233,292,293,298,301],{},[251,294,295],{},[21,296,297],{},"Provider … could not be found",[251,299,300],{},"Dein Code fragt nach einem Anbieter, den Supabase nicht kennt",[251,302,303,306,307,310],{},[21,304,305],{},"google"," als Anbieter in ",[21,308,309],{},"signInWithOAuth"," verwenden",[42,312,314],{"id":313},"warum-google-danach-redirect_uri_mismatch-meldet","Warum Google danach redirect_uri_mismatch meldet",[10,316,317],{},"Weil deine Callback-URL nicht auf der Liste des Clients steht, genau so\ngeschrieben, wie Supabase sie schickt.",[10,319,320,321,324,325,330,331,334],{},"Das ist der zweite Tresen. Wenn Supabase die Anmeldung beginnt, übergibt es die\nPerson an Google, mit einem Zettel, wohin sie zurückgeschickt werden soll: zur\nCallback-URL deines Projekts. Google vergleicht diesen Zettel mit ",[136,322,323],{},"Authorized\nredirect URIs"," des Clients, den du angelegt hast. Seine\n",[56,326,329],{"href":327,"rel":328},"https:\u002F\u002Fdevelopers.google.com\u002Fidentity\u002Fprotocols\u002Foauth2\u002Fweb-server",[60],"OAuth-Dokumentation","\nbeschreibt den Fehler in einer Zeile: \"The ",[21,332,333],{},"redirect_uri"," passed in the\nauthorization request does not match an authorized redirect URI for the OAuth\nclient ID.\"",[10,336,337,338,341,342,345,346,349],{},"Der Abgleich ist exakt. Dieselbe Seite sagt: \"the ",[21,339,340],{},"http"," or ",[21,343,344],{},"https"," scheme, case,\nand trailing slash ('\u002F') must all match.\" Ein Eintrag, der auf\n",[21,347,348],{},"\u002Fauth\u002Fv1\u002Fcallback\u002F"," endet, mit einem Schrägstrich am Ende, passt also nicht zu\nder Adresse, die Supabase schickt.",[10,351,352,355,356,359,360,37],{},[136,353,354],{},"Die Adresse deiner eigenen App bewirkt auf dieser Liste nichts."," Google\nschickt die Leute zurück zu Supabase, die einzige Adresse, die es je prüft, ist\nalso der Callback von Supabase. Die Adresse deiner App gehört auf die Liste des\nanderen Tresens, Redirect URLs bei Supabase, die entscheidet, wohin Supabase die\nLeute ganz am Ende schickt. Ist diese Liste falsch, landen die Leute angemeldet\nauf ",[21,357,358],{},"localhost:3000",", und\n",[56,361,363],{"href":362},"\u002Fblog\u002Fsupabase-auth-redirects-to-localhost","dazu gibt es einen eigenen Beitrag",[10,365,366],{},"Gib Google nach dem Speichern etwas Zeit. Seine Hilfeseite zu OAuth-Clients\nsagt: \"It may take 5 minutes to a few hours for changes made to these settings\nto take effect.\"",[97,368],{"alt":369,"caption":370,"src":371},"Die Liste von Google enthält die Callback-Adresse von Supabase und schickt die Person zurück zu Supabase. Ein Eintrag mit der Adresse der App selbst ist durchgestrichen. Die Liste von Supabase enthält die Adresse der App und schickt sie nach Hause.","Jeder Tresen prüft seine eigene Liste. Die von Google braucht den Callback von Supabase, die von Supabase braucht deine App.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Ftwo-lists-1600x760.png",[42,373,375],{"id":374},"wo-das-client-secret-hingehört","Wo das Client Secret hingehört",[10,377,378],{},"Ins Supabase-Dashboard und nirgendwo sonst hin. Der Code deiner App braucht es\nnie.",[10,380,381,382,384],{},"Die Client ID ist öffentlich: Sie steht in der Adresse der Anmeldeseite von\nGoogle, wo jeder sie lesen kann. Das Client Secret ist das, was Google beweist,\ndass eine Anfrage von deiner Seite kommt, und in diesem Aufbau hat es nur\nSupabase. Wenn deine App ",[21,383,309],{}," aufruft, schickt die Bibliothek den\nBrowser zu Supabase, und Supabase Auth ist es, das mit dem Secret mit Google\nredet.",[10,386,387,388,391,392,395,396,400,401,404,405,408],{},"Hat dein Builder das Secret also in den Code deiner App gesteckt, oder in eine\nVariable, deren Name mit ",[21,389,390],{},"VITE_"," oder ",[21,393,394],{},"NEXT_PUBLIC_"," beginnt, liegt es im\nBrowser jedes Besuchers.\n",[56,397,399],{"href":398},"\u002Fblog\u002Fvite-and-next-public-env-vars","Diese Variablen sind absichtlich öffentlich",".\nGoogles Hilfeseite sagt es deutlich: \"Never add client secrets directly in your\ncode or check them into version control systems such as Git or Subversion.\"\nErsetz es auf der Seite des Clients in der Konsole von Google: Drück ",[136,402,403],{},"Add\nSecret",", füg das neue Secret bei Supabase ein, dann ",[136,406,407],{},"Disable"," beim alten und\nlösch es. Nimm den alten Wert auch aus deinem Code.",[10,410,411,412,37],{},"Um zu prüfen, was deine Live-App an Besucher ausliefert, musst du den Builder\nnicht öffnen. Unser kostenloser Scan liest deine Live-App so, wie der Browser\neines Besuchers es tut, und meldet die geheimen Schlüssel, die er erkennt,\ndazu Tabellen, die jedem antworten, und fehlende Header. Er dauert etwa 20\nSekunden und braucht kein Konto: ",[56,413,415],{"href":414},"\u002Fsecurity-scanner","scanne deine App",[42,417,419],{"id":418},"die-app-im-blick-behalten-bei-der-sich-jetzt-leute-anmelden","Die App im Blick behalten, bei der sich jetzt Leute anmelden",[10,421,422],{},"Sobald sich Leute mit Google anmelden, liegen ihre Konten in deinem\nSupabase-Projekt, und die App, bei der sie sich anmelden, ändert sich mit jedem\nDeploy.",[10,424,425],{},[136,426,427,431],{},[56,428,430],{"href":429},"\u002Fwebsite-monitoring","Reeve Monitor"," prüft deine Live-App weiter:",[172,433,434,437,440,443],{},[175,435,436],{},"ob sie erreichbar ist, alle 60 Sekunden",[175,438,439],{},"alle neun Prüfungen jede Stunde, für bis zu drei Apps, einschließlich geheimer Schlüssel im Code, den deine App an Besucher schickt",[175,441,442],{},"eine Nachricht, wenn sich ein Ergebnis ändert, damit dich ein Schlüssel, der mit einem späteren Deploy hinausgeht, erreicht, ohne dass du nachsehen musst",[175,444,445],{},"ein monatlicher Bericht in klarer Sprache über das, was er gesehen hat",[10,447,448],{},[136,449,450,454],{},[56,451,453],{"href":452},"\u002Fsupabase-backups","Reeve Care"," hält eine Kopie deiner Supabase-Datenbank,\nsamt Konten:",[172,456,457,460,463,466,469,472],{},[175,458,459],{},"eine verschlüsselte Kopie nach Zeitplan, auf Reeves eigenem Speicher in der EU, außerhalb deines Supabase-Kontos",[175,461,462],{},"das Auth-Schema, in dem Supabase jeden Nutzer und die Google-Identität hält, mit der er sich angemeldet hat, damit sie mit allem anderen zurückkommen",[175,464,465],{},"jede Kopie geprüft, bevor sie zählt, durch Zählen der Zeilen in jeder Tabelle",[175,467,468],{},"auch deine hochgeladenen Dateien, sobald du einen Storage-Zugang verbindest",[175,470,471],{},"eine Wiederherstellung per Klick, mit einer Sicherheitskopie des aktuellen Stands vorab",[175,473,474],{},"alles, was Monitor tut",[42,476,478],{"id":477},"was-du-jetzt-tun-solltest","Was du jetzt tun solltest",[480,481,482],"key-takeaways",{},[172,483,484,487,490,493,496],{},[175,485,486],{},"Lies die Projektreferenz auf der Fehlerseite und schalte Google in genau diesem Projekt unter Authentication, Sign In \u002F Providers ein.",[175,488,489],{},"Leg bei Google einen Client vom Typ Web application an, mit deiner Supabase-Callback-URL unter Authorized redirect URIs, genau so, wie Supabase sie zeigt.",[175,491,492],{},"Füg die Client ID und das Client Secret im Google-Bereich von Supabase ein und speichere.",[175,494,495],{},"Meldet Google redirect_uri_mismatch, vergleich die beiden Adressen Zeichen für Zeichen und gib Googles Änderung dann ein paar Minuten.",[175,497,498],{},"Lass das Client Secret nur bei Supabase. Ist es je im Code deiner App gelandet, leg bei Google ein neues an und deaktiviere das alte.",[10,500,501,502,505,506,510],{},"Kommen die Leute durch Google und landen dann auf der falschen Seite, macht\n",[56,503,504],{"href":362},"der Beitrag zu den Weiterleitungen","\ndort weiter. Die ",[56,507,509],{"href":508},"\u002Fchecklist","10-Minuten-Sicherheitscheckliste"," zeigt, was du\nvor dem Start sonst noch ansehen solltest.",{"title":23,"searchDepth":512,"depth":512,"links":513},3,[514,516,517,518,519,520,521],{"id":44,"depth":515,"text":45},2,{"id":104,"depth":515,"text":105},{"id":122,"depth":515,"text":123},{"id":313,"depth":515,"text":314},{"id":374,"depth":515,"text":375},{"id":418,"depth":515,"text":419},{"id":477,"depth":515,"text":478},"Sicherheitsgrundlagen","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcover-1200x630.png","Eine Einstellungsliste mit einem nach vorn gezogenen Anbieter: Schalter aus, amber umrandet, beide Schlüsselfelder leer.","\"Unsupported provider: provider is not enabled\" heißt: Google-Login ist in deinem Supabase-Projekt aus. Die Lösung, und was bei redirect_uri_mismatch hilft.",false,"md",[529,532,535,538,541],{"q":530,"a":531},"Warum öffnet die Anmeldung mit Google eine Seite voller JSON mit validation_failed?","Deine App hat den Browser zur Adresse \u002Fauth\u002Fv1\u002Fauthorize deines Supabase-Projekts geschickt, und Supabase hat dort geantwortet, statt die Person an Google weiterzugeben. Auf der Seite steht {\"code\":400,\"error_code\":\"validation_failed\",\"msg\":\"Unsupported provider: provider is not enabled\"}. Deine App bekommt diese Antwort nie zu sehen, deshalb zeigt ihre Konsole nichts. Schalte Google unter Authentication, Sign In \u002F Providers ein.",{"q":533,"a":534},"Ich habe Google eingeschaltet, und der Fehler kommt trotzdem. Warum?","Meist redet deine App mit einem anderen Supabase-Projekt als dem, das du geändert hast. Die Adresse auf der Fehlerseite beginnt mit der Referenz des Projekts, den Buchstaben vor .supabase.co; vergleich sie mit der Referenz in der Adressleiste deines Dashboards. Stimmen sie überein, lies das Ende der Meldung: \"missing OAuth secret\" heißt, dass das Feld für das Client Secret noch leer ist.",{"q":536,"a":537},"Was gehört bei Supabase unter Authorized redirect URIs?","Die Callback-URL deines Projekts, https:\u002F\u002F\u003Cproject-ref>.supabase.co\u002Fauth\u002Fv1\u002Fcallback, kopiert aus dem Eintrag Google auf der Seite Sign In \u002F Providers. Google schickt die Leute zurück zu Supabase, und Supabase schickt sie weiter zu deiner App. Die Adresse deiner App gehört deshalb auf die Liste Redirect URLs bei Supabase.",{"q":539,"a":540},"Muss ich meine Google-App veröffentlichen oder Testnutzer eintragen?","Nicht für eine Anmeldung, die nur Name, E-Mail-Adresse und Profil abfragt, und mehr fragt Supabase bei Google nicht an, solange dein Code keine Scopes ergänzt. Googles Seite zur Zielgruppe einer App sagt, dass die Nutzer einer solchen App nicht auf der Liste der Testnutzer stehen müssen. Fragst du mehr an, etwa Zugriff auf Drive, gelten die Grenzen für Tests.",{"q":542,"a":543},"Ich nutze eine eigene Domain für Supabase. Welche Callback-URL braucht Google?","Beide. Supabases Anleitung zu eigenen Domains sagt, du sollst den Callback der eigenen Domain, etwa https:\u002F\u002Fapi.example.com\u002Fauth\u002Fv1\u002Fcallback, in der Konsole des Anbieters eintragen, zusätzlich zum supabase.co-Callback des Projekts.","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled\u002Fcard-800x500.png",[546,547,548,549,550,551],"unsupported provider provider is not enabled","supabase google login funktioniert nicht","supabase google login not working","redirect_uri_mismatch supabase","supabase google oauth callback url","supabase anmeldung mit google",{},true,"Supabase-Fehler: Unsupported provider: provider is not enabled","\u002Fblog\u002Funsupported-provider-provider-is-not-enabled","2026-11-08",{"title":5,"description":525},"blog\u002Funsupported-provider-provider-is-not-enabled",[560,561,562],"\"Unsupported provider: provider is not enabled\" heißt, dass im Supabase-Projekt, zu dem deine App die Person geschickt hat, die Anmeldung mit Google ausgeschaltet ist. Schalte sie unter Authentication, Sign In \u002F Providers ein, in genau diesem Projekt.","Danach prüft Google eine eigene Liste. Deine Supabase-Callback-URL muss Zeichen für Zeichen unter Authorized redirect URIs deines OAuth-Clients stehen, sonst antwortet Google mit redirect_uri_mismatch.","Das Client Secret gehört ins Supabase-Dashboard und nirgendwo sonst hin. Der Code deiner App braucht es nie.","_69K8Dka6evCH5wKXB5FfFEpy9NZmGzhZj9X_AF21C0",[565,571,572,578,584,590,596,602,607,613,619,626,632,638,644,650,656,662,668,674,680,686,692,698,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,794,800,806,812,818,824,830,835,841,847,853,859,865,871,877,882,888,894,900,906,912,918,924,930,936,942,948,954,960,966,972,978,984,990,996,1002,1008,1014,1020,1026,1032,1038,1044,1050,1056,1061,1067,1073,1079,1084,1090],{"path":566,"title":567,"description":568,"published":569,"category":522,"image":570,"draft":526},"\u002Fblog\u002Fmax-client-connections-reached","Supabase \"max client connections reached\" erklärt","Supabase \"max client connections reached\": Der Pooler hat keinen Platz für noch einen Client. Der Port in deinem Connection String setzt das Limit.","2026-11-09","\u002Fblog\u002Fmax-client-connections-reached\u002Fcard-800x500.png",{"path":555,"title":5,"description":525,"published":556,"category":522,"image":544,"draft":526},{"path":573,"title":574,"description":575,"published":576,"category":522,"image":577,"draft":526},"\u002Fblog\u002Fviolates-foreign-key-constraint","Supabase-Fehler \"violates foreign key constraint\" beim Einfügen","Supabase \"insert or update on table violates foreign key constraint\": Deine Zeile zeigt auf eine, die es nicht gibt. Welche, warum, und die Lösung.","2026-11-07","\u002Fblog\u002Fviolates-foreign-key-constraint\u002Fcard-800x500.png",{"path":579,"title":580,"description":581,"published":582,"category":522,"image":583,"draft":526},"\u002Fblog\u002Fnull-value-violates-not-null-constraint","Supabase-Fehler \"null value in column violates not-null constraint\"","Supabase \"null value in column violates not-null constraint\": Eine Pflichtspalte kam leer an. Woher die Null kommt, und die Lösung.","2026-11-06","\u002Fblog\u002Fnull-value-violates-not-null-constraint\u002Fcard-800x500.png",{"path":585,"title":586,"description":587,"published":588,"category":522,"image":589,"draft":526},"\u002Fblog\u002Fauth-session-missing","Supabase \"Auth session missing!\": wo die Sitzung geblieben ist","\"Auth session missing!\" heißt: supabase-js fand keine angemeldete Sitzung und fragte Supabase gar nicht erst. Wo die Sitzung blieb, und die Lösung je Fall.","2026-11-05","\u002Fblog\u002Fauth-session-missing\u002Fcard-800x500.png",{"path":591,"title":592,"description":593,"published":594,"category":522,"image":595,"draft":526},"\u002Fblog\u002Finvalid-claim-missing-sub-claim","Supabase \"invalid claim: missing sub claim\": niemand ist angemeldet","\"invalid claim: missing sub claim\" heißt: Supabase Auth bekam ein echtes Token ohne Nutzer darin, deinen Projektschlüssel statt einer Sitzung.","2026-11-04","\u002Fblog\u002Finvalid-claim-missing-sub-claim\u002Fcard-800x500.png",{"path":597,"title":598,"description":599,"published":600,"category":522,"image":601,"draft":526},"\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function","\"Failed to send a request to the Edge Function\": der echte Grund","\"Failed to send a request to the Edge Function\" heißt: Der Browser hat keine lesbare Antwort bekommen. Seine Konsole sagt, warum, und ob deine Funktion lief.","2026-11-03","\u002Fblog\u002Ffailed-to-send-a-request-to-the-edge-function\u002Fcard-800x500.png",{"path":362,"title":603,"description":604,"published":605,"category":522,"image":606,"draft":526},"Warum Supabase-E-Mail-Links auf localhost:3000 weiterleiten","Leitet Supabase auf localhost:3000 um, ist die Site URL unverändert, oder deine Adresse fehlt in Redirect URLs. Die Lösung und der Platzhalter, den du meidest.","2026-11-02","\u002Fblog\u002Fsupabase-auth-redirects-to-localhost\u002Fcard-800x500.png",{"path":608,"title":609,"description":610,"published":611,"category":522,"image":612,"draft":526},"\u002Fblog\u002Femail-link-is-invalid-or-has-expired","Supabase \"Email link is invalid or has expired\" bei einem neuen Link","Bei einem Link von vor einer Minute heißt Supabases \"Email link is invalid or has expired\" meist: Ein Mailfilter hat ihn zuerst benutzt. Prüfen und beheben.","2026-11-01","\u002Fblog\u002Femail-link-is-invalid-or-has-expired\u002Fcard-800x500.png",{"path":614,"title":615,"description":616,"published":617,"category":522,"image":618,"draft":526},"\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout","Supabase \"canceling statement due to statement timeout\" erklärt","Supabase \"canceling statement due to statement timeout\": Eine Abfrage lief länger als ihre Rolle darf, 3 Sekunden für Besucher. Prüf zuerst die RLS-Regel.","2026-10-31","\u002Fblog\u002Fcanceling-statement-due-to-statement-timeout\u002Fcard-800x500.png",{"path":620,"title":621,"description":622,"published":623,"category":624,"image":625,"draft":526},"\u002Fblog\u002Fdatabase-error-deleting-user","\"Database error deleting user\" in Supabase und was mitgelöscht wird","\"Database error deleting user\" in Supabase heißt: Deine Datenbank hat das Löschen abgelehnt. Der Grund steht im Log, die Lösung entscheidet, was mitgeht.","2026-10-30","Backups","\u002Fblog\u002Fdatabase-error-deleting-user\u002Fcard-800x500.png",{"path":627,"title":628,"description":629,"published":630,"category":522,"image":631,"draft":526},"\u002Fblog\u002Fstripe-webhook-no-signatures-found","\"No signatures found matching the expected signature\" bei Supabase","Ein Stripe-Webhook in einer Supabase Edge Function meldet \"No signatures found matching the expected signature\"? Zwei Ursachen. Prüfe weiter.","2026-10-29","\u002Fblog\u002Fstripe-webhook-no-signatures-found\u002Fcard-800x500.png",{"path":633,"title":634,"description":635,"published":636,"category":522,"image":637,"draft":526},"\u002Fblog\u002Fsupabase-invalid-login","\"Invalid login credentials\" in Supabase: die drei Ursachen","Supabase sagt \"Invalid login credentials\" bei falschem Passwort, unbekannter E-Mail und Google-Konto. So erkennst du, welcher Fall es ist.","2026-10-28","\u002Fblog\u002Fsupabase-invalid-login\u002Fcard-800x500.png",{"path":639,"title":640,"description":641,"published":642,"category":522,"image":643,"draft":526},"\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code","\"Edge Function returned a non-2xx status code\": der echte Fehler","\"Edge Function returned a non-2xx status code\" heißt: Deine Supabase-Funktion hat mit einem Fehler geantwortet. So liest du den echten.","2026-10-27","\u002Fblog\u002Fedge-function-returned-a-non-2xx-status-code\u002Fcard-800x500.png",{"path":645,"title":646,"description":647,"published":648,"category":522,"image":649,"draft":526},"\u002Fblog\u002Fcertificate-not-trusted","Zertifikat nicht vertrauenswürdig: drei Ursachen außer Ablauf","Zertifikat nicht vertrauenswürdig, obwohl das Datum stimmt? Es nennt eine andere Adresse, hat sich selbst signiert oder seiner Kette fehlt ein Glied.","2026-10-26","\u002Fblog\u002Fcertificate-not-trusted\u002Fcard-800x500.png",{"path":651,"title":652,"description":653,"published":654,"category":522,"image":655,"draft":526},"\u002Fblog\u002Finvalid-input-syntax-for-type-uuid","Supabase \"invalid input syntax for type uuid\": was im Zitat steht","Supabase \"invalid input syntax for type uuid\" heißt: Deine App hat etwas geschickt, das keine ID ist. Zitat lesen, Abfrage zurückhalten, Spalte behalten.","2026-10-25","\u002Fblog\u002Finvalid-input-syntax-for-type-uuid\u002Fcard-800x500.png",{"path":657,"title":658,"description":659,"published":660,"category":522,"image":661,"draft":526},"\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint","Supabase \"duplicate key value violates unique constraint\" erklärt","Supabase \"duplicate key value violates unique constraint\" heißt: Der Wert ist schon vergeben. Spalte finden, Lösung wählen, Wert vom Bildschirm fernhalten.","2026-10-24","\u002Fblog\u002Fduplicate-key-value-violates-unique-constraint\u002Fcard-800x500.png",{"path":663,"title":664,"description":665,"published":666,"category":522,"image":667,"draft":526},"\u002Fblog\u002Fsupabase-relation-does-not-exist","Supabase \"relation does not exist\", obwohl die Tabelle da ist","Supabase \"relation does not exist\" oder PGRST205: Keine Tabelle passt zu Name und Schema deiner Abfrage. Vier Prüfungen, und was eine Freigabe öffnet.","2026-10-23","\u002Fblog\u002Fsupabase-relation-does-not-exist\u002Fcard-800x500.png",{"path":669,"title":670,"description":671,"published":672,"category":522,"image":673,"draft":526},"\u002Fblog\u002Fsupabase-function-not-found","Supabase PGRST202: \"Could not find the function in the schema cache\"","Supabase \"Could not find the function in the schema cache\" nennt die Argumente, die deine App geschickt hat. Vergleich sie mit der Funktion.","2026-10-22","\u002Fblog\u002Fsupabase-function-not-found\u002Fcard-800x500.png",{"path":675,"title":676,"description":677,"published":678,"category":522,"image":679,"draft":526},"\u002Fblog\u002Fsupabase-schema-cache-column-error","Supabase PGRST204: \"Could not find the column in the schema cache\"","Supabase \"Could not find the column in the schema cache\" heißt meist: Der Name passt nicht. Vier Prüfungen und der Einzeiler zum Neuladen.","2026-10-21","\u002Fblog\u002Fsupabase-schema-cache-column-error\u002Fcard-800x500.png",{"path":681,"title":682,"description":683,"published":684,"category":522,"image":685,"draft":526},"\u002Fblog\u002Fsupabase-email-rate-limit-exceeded","Supabase \"Email Rate Limit Exceeded\": zwei Limits, ein Fehlercode","Supabase \"Email Rate Limit Exceeded\" begrenzt jede E-Mail deines Projekts: 2 pro Stunde beim eingebauten Absender. Was zählt und wie du es anhebst.","2026-10-20","\u002Fblog\u002Fsupabase-email-rate-limit-exceeded\u002Fcard-800x500.png",{"path":687,"title":688,"description":689,"published":690,"category":522,"image":691,"draft":526},"\u002Fblog\u002Fsupabase-users-logged-out","Supabase \"Invalid Refresh Token: Refresh Token Not Found\": 3 Ursachen","Supabase \"Invalid Refresh Token: Refresh Token Not Found\" meldet deine Nutzer ab. Drei Ursachen, und wie das Auth-Log sie trennt.","2026-10-19","\u002Fblog\u002Fsupabase-users-logged-out\u002Fcard-800x500.png",{"path":693,"title":694,"description":695,"published":696,"category":522,"image":697,"draft":526},"\u002Fblog\u002Fpermission-denied-for-schema-public","Supabase \"permission denied for schema public\": drei Ursachen","Supabase \"permission denied for schema public\" heißt: Ein Grant auf das Schema fehlt. Was ihn entfernt hat und welche Zeile ihn zurückbringt.","2026-10-18","\u002Fblog\u002Fpermission-denied-for-schema-public\u002Fcard-800x500.png",{"path":699,"title":700,"description":701,"published":702,"category":522,"image":703,"draft":526},"\u002Fblog\u002Fsupabase-bucket-not-found","Supabase \"Bucket not found\": die drei Dinge, die es bedeutet","Supabase \"Bucket not found\" ist eins von drei Dingen: ein öffentlicher Link zu einem privaten Bucket, ein ungenauer Name oder das falsche Projekt.","2026-10-17","\u002Fblog\u002Fsupabase-bucket-not-found\u002Fcard-800x500.png",{"path":705,"title":706,"description":707,"published":708,"category":522,"image":709,"draft":526},"\u002Fblog\u002Fsupabase-invalid-jwt","Supabase invalid JWT: Welcher Schlüssel streikt hier?","Ein Supabase invalid JWT ist PGRST301: ein signiertes Token hat die Prüfung nicht bestanden. In neueren Projekten ist das die Sitzung, nicht der API-Schlüssel.","2026-10-16","\u002Fblog\u002Fsupabase-invalid-jwt\u002Fcard-800x500.png",{"path":711,"title":712,"description":713,"published":714,"category":522,"image":715,"draft":526},"\u002Fblog\u002Fsupabase-single-row-error","Supabase \"multiple (or no) rows returned\" heißt meist: keine Zeilen","Supabase gibt PGRST116 zurück, \"JSON object requested, multiple (or no) rows returned\", wenn die Abfrage nichts fand. Versteckte Zeilen wirken fehlend.","2026-10-15","\u002Fblog\u002Fsupabase-single-row-error\u002Fcard-800x500.png",{"path":717,"title":718,"description":719,"published":720,"category":522,"image":721,"draft":526},"\u002Fblog\u002Fdatabase-error-saving-new-user","\"Database error saving new user\" in Supabase: wo du nachsiehst","\"Database error saving new user\" heißt: etwas an deiner Supabase-Registrierung ist fehlgeschlagen. Der echte Fehler steht in deinen Logs.","2026-10-14","\u002Fblog\u002Fdatabase-error-saving-new-user\u002Fcard-800x500.png",{"path":723,"title":724,"description":725,"published":726,"category":522,"image":727,"draft":526},"\u002Fblog\u002Fwhat-is-supabase","Was ist Supabase? Die Datenbank, die dein Builder ausgesucht hat","Was ist Supabase: die Datenbank, der Login und der Dateispeicher hinter deiner App. Supabase betreibt die Server, die Regeln zu deinen Zeilen gehören dir.","2026-10-13","\u002Fblog\u002Fwhat-is-supabase\u002Fcard-800x500.png",{"path":729,"title":730,"description":731,"published":732,"category":522,"image":733,"draft":526},"\u002Fblog\u002Faws-access-key-exposed-in-frontend","Ein offengelegter AWS-Schlüssel im Frontend ist kein OpenAI-Key","Ein im Frontend offengelegter AWS-Zugriffsschlüssel liest und schreibt deinen Speicher. Die Lösung ist meist eine presigned URL, kein neuer Schlüssel.","2026-10-12","\u002Fblog\u002Faws-access-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":735,"title":736,"description":737,"published":738,"category":522,"image":739,"draft":526},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" beim Upload","\"New row violates row-level security policy for table objects\" heißt: Deinem Upload fehlt eine insert-Regel. Ein öffentlicher Bucket fügt keine hinzu.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":741,"title":742,"description":743,"published":744,"category":522,"image":745,"draft":526},"\u002Fblog\u002Fbase44-security-scan","Base44 Security Scan: das, was nur er sehen kann","Der Base44 Security Scan prüft sieben Arten von Problemen von innen. Hier ist die Hälfte, die er liest und sonst niemand, und die Hälfte, die er nie ansieht.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":747,"title":748,"description":749,"published":750,"category":522,"image":751,"draft":526},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Dein API-Key wurde geleakt. Die richtige Reihenfolge","Ein API-Key wurde geleakt und du weißt nicht, was zuerst zu tun ist. Nicht jeder Key im Frontend ist ein Leck, und die Reihenfolge zählt mehr als das Tempo.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":753,"title":754,"description":755,"published":756,"category":522,"image":757,"draft":526},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" ohne RLS abzuschalten","\"Infinite recursion detected in policy for relation\" heißt: Deine Policy hat die Tabelle gefragt, die sie schützt. So brichst du den Kreis.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":759,"title":760,"description":761,"published":762,"category":522,"image":763,"draft":526},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" in Supabase, und die falsche Lösung","\"No API key found in request\" heißt, deine Supabase-Anfrage kam ohne Schlüssel an. Die meisten Antworten zeigen stattdessen auf deine Datenbankregeln.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":765,"title":766,"description":767,"published":768,"category":522,"image":769,"draft":526},"\u002Fblog\u002Fis-base44-safe","Ist Base44 sicher? Was 5.442 echte Base44-Apps zeigten","Ist Base44 sicher? Wir haben 5.442 laufende Base44-Apps mit neun Checks geprüft. Fast alle bekamen ein B, aus Gründen, die der Inhaber nie gewählt hat.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":771,"title":772,"description":773,"published":774,"category":522,"image":775,"draft":526},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","API-Schlüssel verstecken: ab in eine Supabase Edge Function","Einen API-Schlüssel verstecken heißt, ihn aus dem Browser zu nehmen. Eine Supabase Edge Function ist der kleinste Ort dafür, und zwei Schritte zählen mehr.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":777,"title":778,"description":779,"published":780,"category":522,"image":781,"draft":526},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Ist deine .env-Datei öffentlich? Zwölf Pfade zum Prüfen","Ist deine .env-Datei auf deinem eigenen Webserver öffentlich? Zwölf Adressen sagen es dir, und ein Treffer heißt: alles darin ist längst öffentlich.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":783,"title":784,"description":785,"published":786,"category":522,"image":787,"draft":526},"\u002Fblog\u002Fis-v0-safe","v0-Sicherheit: alle 1.790 gescannten v0-Apps bekamen ein A","v0-Sicherheit, gemessen an 1.790 laufenden v0-Apps: Jede bekam ein A. Nur 17 nannten eine Datenbank, und genau das misst das A vor allem.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":789,"title":790,"description":791,"published":792,"category":522,"image":793,"draft":526},"\u002Fblog\u002Fis-bolt-safe","Ist Bolt sicher? Was 1.123 echte Bolt-Apps zeigten","Ist Bolt sicher? Wir haben 1.123 laufende Bolt-Apps mit neun Checks geprüft. Das Hosting war sauber. Die Funde waren Schlüssel und offene Tabellen in den Apps.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":795,"title":796,"description":797,"published":798,"category":522,"image":799,"draft":526},"\u002Fblog\u002Fis-supabase-down-or-your-app","Ist Supabase down oder liegt es an deiner App? So erkennst du es","Ist Supabase down oder liegt es an deiner App? Ein pausiertes Projekt, eine volle Datenbank und ein eigener Fehler sehen gleich aus. Vier Prüfungen helfen.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":801,"title":802,"description":803,"published":804,"category":522,"image":805,"draft":526},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","Verschlüsselt Supabase meine Daten? Ja. Wovor das schützt","Verschlüsselt Supabase Daten? Ja: AES-256 im Ruhezustand, TLS bei der Übertragung, SOC 2 und ISO 27001. Was jedes abdeckt und welches Leck keines stoppt.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":807,"title":808,"description":809,"published":810,"category":522,"image":811,"draft":526},"\u002Fblog\u002Fsupabase-free-plan-limits","Supabase Gratis-Tarif: die Limits und was an jedem passiert","Die Limits des Supabase-Gratis-Tarifs: 500 MB Datenbank, 5 GB Egress und keine Backups. Was an jeder Grenze passiert und was $25 für Pro ändern.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":813,"title":814,"description":815,"published":816,"category":624,"image":817,"draft":526},"\u002Fblog\u002Ftest-your-supabase-backup","Teste dein Supabase-Backup, bevor du es brauchst","So testest du dein Supabase-Backup: in ein Übungsprojekt einspielen, Zeilen zählen, anmelden und die Zeile suchen, die einer abgeschnittenen Datei fehlt.","2026-09-28","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":819,"title":820,"description":821,"published":822,"category":624,"image":823,"draft":526},"\u002Fblog\u002Fsupabase-backup-github-action","Kostenloses Supabase-Backup per GitHub Action, mit Haken","Eine Supabase-Backup-GitHub-Action kostet nichts und passt für viele Apps. Der Workflow, der richtige Connection String und das Egress pro Lauf.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":825,"title":826,"description":827,"published":828,"category":624,"image":829,"draft":526},"\u002Fblog\u002Fdownload-your-supabase-backup","Warum du dein Supabase-Backup nicht herunterladen kannst","Dein Supabase-Backup kannst du auf aktuellen Projekten nicht herunterladen, weil die Tageskopie physisch ist. Wie du es prüfst und selbst eine Kopie hältst.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":831,"title":832,"description":833,"published":828,"category":522,"image":834,"draft":526},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": der fehlende Grant","Ab 30. Oktober antwortet eine neue Supabase-Tabelle mit \"permission denied for table\", bis du Zugriff erteilst. Der Grant aus der E-Mail ist die halbe Lösung.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":836,"title":837,"description":838,"published":839,"category":522,"image":840,"draft":526},"\u002Fblog\u002Fopen-api-endpoint-exposed","Ist ein offener API-Endpunkt ein Sicherheitsproblem? Sieh ins JSON","Dein Scan hat einen offenen API-Endpunkt gemeldet. Ob das zählt, hängt davon ab, was zurückkam, und die meisten hier gehörten der Plattform.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":842,"title":843,"description":844,"published":845,"category":522,"image":846,"draft":526},"\u002Fblog\u002Flovable-security-scan","Lovable Security Scan: das Eine, was er nicht beweist","Lovable Security Scan: was Quick Scan und Deep Scan prüfen, wann welcher läuft, und das Eine, was kein Scan von innen beweisen kann.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":848,"title":849,"description":850,"published":851,"category":624,"image":852,"draft":526},"\u002Fblog\u002Fsupabase-backup-auth-users","Warum in deinem Supabase-Dump keine Nutzer stehen","Führe supabase db dump allein aus und du bekommst die Form deiner Datenbank und keine einzige Zeile, und das auth-Schema mit deinen Nutzern fehlt ganz.","2026-09-23","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":854,"title":855,"description":856,"published":857,"category":522,"image":858,"draft":526},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domain abgelaufen, Website offline: was jetzt passiert","Deine Domain ist abgelaufen und deine Website ist offline. Welche Frist jetzt läuft, warum das Zertifikat das kleinere Problem ist, und wie du beides prüfst.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":860,"title":861,"description":862,"published":863,"category":522,"image":864,"draft":526},"\u002Fblog\u002Fis-lovable-safe","Ist Lovable sicher? Was 18.554 echte Lovable-Apps zeigten","Ist Lovable sicher? Wir haben 18.554 laufende Lovable-Apps mit neun Checks geprüft. Die Plattform war die sauberste von fünf. Die Funde saßen in den Apps.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":866,"title":867,"description":868,"published":869,"category":522,"image":870,"draft":526},"\u002Fblog\u002Fvibe-coded-app-security-checklist","Die Sicherheits-Checkliste für Vibe-Coding, in neun Prüfungen","Eine Sicherheits-Checkliste für Vibe-Coding mit neun Punkten, die jeder von außen an deiner Live-App nachprüfen kann, jeder mit einem Test in einer Zeile.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":872,"title":873,"description":874,"published":875,"category":522,"image":876,"draft":526},"\u002Fblog\u002Fstripe-secret-key-in-frontend","Ein geheimer Stripe-Schlüssel im Frontend kann Geld bewegen","Ein geheimer Stripe-Schlüssel im Frontend kann erstatten, abbuchen und jeden Kundendatensatz lesen, den du hast. Dein pk_live_-Schlüssel gehört dorthin.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":398,"title":878,"description":879,"published":880,"category":522,"image":881,"draft":526},"Vite-Env-Variablen offengelegt: der Präfix heißt veröffentlichen","Vite-Env-Variablen offengelegt: Deine App hat getan, was der Präfix verlangt. VITE_ und NEXT_PUBLIC_ heißen veröffentlichen, und die KI kannte den Preis nie.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":883,"title":884,"description":885,"published":886,"category":522,"image":887,"draft":526},"\u002Fblog\u002Fbase44-source-maps","Base44-Sicherheit: was ein Scan meldet und was du ändern kannst","Base44-Sicherheit auf 5.438 gescannten Apps: Drei Befunde auf fast jeder gehören der Plattform, die Source Map ist das Base44-Badge, und deine Liste ist kurz.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":889,"title":890,"description":891,"published":892,"category":522,"image":893,"draft":526},"\u002Fblog\u002Fis-cursor-ai-safe","Ist Cursor AI sicher? Editor, Code und die App, die du veröffentlichst","Ist Cursor AI sicher? Drei Fragen in einer Suche: was Cursor behält, was sein Code falsch macht und ob deine veröffentlichte App offen steht.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":895,"title":896,"description":897,"published":898,"category":522,"image":899,"draft":526},"\u002Fblog\u002Fis-replit-safe","Ist Replit sicher? Was wir in 3.042 Replit-Apps gefunden haben","Ist Replit sicher? Wir haben 3.042 laufende Replit-Apps mit neun externen Checks geprüft. Die Funde saßen in der veröffentlichten App, nicht im Hosting.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":901,"title":902,"description":903,"published":904,"category":624,"image":905,"draft":526},"\u002Fblog\u002Fsupabase-storage-backup","Supabase Storage Backup: deine Datenbankkopie hat keine Dateien","Ein Supabase Storage Backup ist eine eigene Aufgabe. Datenbank-Backups enthalten die Liste deiner Dateien und keine davon, also bleibt jeder Upload kaputt.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":907,"title":908,"description":909,"published":910,"category":624,"image":911,"draft":526},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Supabase Point-in-Time Recovery: Kosten und Grenzen","Supabase Point-in-Time Recovery spult deine Datenbank auf jede Sekunde der letzten Woche zurück. $100 im Monat zusätzlich zu Pro, und nur die Datenbank.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":913,"title":914,"description":915,"published":916,"category":624,"image":917,"draft":526},"\u002Fblog\u002Fsupabase-project-paused-recover","Supabase-Projekt pausiert? Deine Daten sind noch da","Supabase hat dein Projekt nach einer Woche ohne Aktivität pausiert. Gelöscht ist nichts, Wiederherstellen steht neben dem Namen, und du hast ein Jahr.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":919,"title":920,"description":921,"published":922,"category":522,"image":923,"draft":526},"\u002Fblog\u002Fsafest-ai-app-builder","Welcher KI-App-Builder ist am sichersten? 30.998 Apps im Test","Welcher KI-App-Builder ist am sichersten? Wir haben 30.998 aktive Apps von Lovable, Base44, Replit, v0 und Bolt gescannt. Der Builder entscheidet das nicht.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":925,"title":926,"description":927,"published":928,"category":522,"image":929,"draft":526},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Row Level Security für jede Supabase-Tabelle aktivieren und prüfen","Row Level Security in Supabase ohne Policy sperrt eine Tabelle komplett. Eine Policy ohne den Schalter bringt gar nichts. Hier ist das SQL, und der Test.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":931,"title":932,"description":933,"published":934,"category":522,"image":935,"draft":526},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": was die Warnung übersieht","Supabase meldet \"RLS disabled in public\" als Fehler. Zur Lese-Policy, die deine Tabelle genauso offen lässt, sagt der Advisor gar nichts.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":937,"title":938,"description":939,"published":940,"category":522,"image":941,"draft":526},"\u002Fblog\u002Frotate-supabase-service-role-key","Geleakten Supabase-service_role-Schlüssel richtig tauschen","Supabase sagt: erst das Leck schließen. Andere Anleitungen: sofort tauschen. Was richtig ist, hängt davon ab, wohin dein service_role-Schlüssel gelangt ist.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":943,"title":944,"description":945,"published":946,"category":522,"image":947,"draft":526},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Vibe-Coding-Security-Scanner im Vergleich, unserer eingeschlossen","Der beste Vibe-Coding-Security-Scanner hängt an drei Fragen, die keine Funktionsliste beantwortet. Acht Tools im Vergleich, mit Preisen und unseren Lücken.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":949,"title":950,"description":951,"published":952,"category":522,"image":953,"draft":526},"\u002Fblog\u002Fsupabase-security-checker","Supabase Security Checker: die fünf Prüfungen selbst machen","Ein Supabase Security Checker liest deine veröffentlichte App statt deiner Projekteinstellungen. Hier sind die fünf Prüfungen und wie du jede selbst ausführst.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":955,"title":956,"description":957,"published":958,"category":522,"image":959,"draft":526},"\u002Fblog\u002Fvibe-coding-security-scanner","Vibe-Coding-Security-Scanner: was ein URL-Scan übersieht","Ein Vibe-Coding-Security-Scanner liest deine laufende App von außen. Was das abdeckt, die vier Dinge, die er nicht sehen kann, und wie du das Ergebnis liest.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":961,"title":962,"description":963,"published":964,"category":522,"image":965,"draft":526},"\u002Fblog\u002Fmissing-security-headers","Fehlende Sicherheitsheader: wann sie wirklich zählen","Fehlende Sicherheitsheader ist unser häufigster Befund. Wogegen sie schützen, und wann sie die unwichtigste Zeile in deinem Bericht sind.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":967,"title":968,"description":969,"published":970,"category":522,"image":971,"draft":526},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","Dein OpenAI-API-Schlüssel liegt im Frontend. Tausch ihn aus.","Ein OpenAI-API-Schlüssel im Frontend lässt sich an keine Domain binden. Tausch ihn heute, leg den Aufruf hinter deinen Server und begrenze das Budget.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":973,"title":974,"description":975,"published":976,"category":522,"image":977,"draft":526},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","API-Schlüssel im Frontend: was 30.998 Apps wirklich ausliefern","Ein API-Schlüssel im Frontend ist meistens ein Google-Maps-Schlüssel. Wir haben 30.998 aktive Vibe-Coding-Apps gescannt und gezählt, was wirklich austritt.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":979,"title":980,"description":981,"published":982,"category":624,"image":983,"draft":526},"\u002Fblog\u002Fsupabase-backup-tools-compared","Supabase-Backup-Tools im Vergleich, unseres eingeschlossen","Vier Arten von Supabase-Backup-Tool, was jedes wirklich kopiert und wann eine kostenlose GitHub Action jeden Anbieter schlägt, uns eingeschlossen.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":985,"title":986,"description":987,"published":988,"category":522,"image":989,"draft":526},"\u002Fblog\u002Freplit-secrets-explained","Secrets in Replit nutzen, und was trotzdem veröffentlicht wird","Secrets in Replit nutzen: anlegen, auslesen und die zwei Gründe beheben, warum undefined zurückkommt. Dazu die Schlüssel, die das Werkzeug nicht schützt.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":991,"title":992,"description":993,"published":994,"category":624,"image":995,"draft":526},"\u002Fblog\u002Fback-up-supabase-free-tier","Supabase Gratis-Tarif: Backup ohne Terminal selbst machen","Im Supabase Gratis-Tarif gibt es keine Backups, die Kopie musst du selbst machen. Wie das im Dashboard geht und was der CSV-Weg auslässt.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":997,"title":998,"description":999,"published":1000,"category":522,"image":1001,"draft":526},"\u002Fblog\u002Fis-supabase-secure","Ist Supabase sicher? Ja. Dein Projekt ist eine eigene Frage","Ist Supabase sicher? Die Plattform ist auditiert, verschlüsselt und pentestet. Supabase schreibt selbst auf, wo das aufhört und deine Einstellungen anfangen.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":1003,"title":1004,"description":1005,"published":1006,"category":522,"image":1007,"draft":526},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Wo du deine Supabase API-Keys findest: anon, service_role, URL","Projekt-URL, anon-Schlüssel und service_role-Schlüssel liegen auf einer Seite im Dashboard. Wo sie ist, und welcher der vier Werte in deine App gehört.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":1009,"title":1010,"description":1011,"published":1012,"category":522,"image":1013,"draft":526},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy in Supabase: was jetzt?","\"New row violates row-level security policy\" heißt, Supabase hat einen Schreibvorgang abgelehnt. Die schnelle Lösung öffnet die Tabelle wieder für alle.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":1015,"title":1016,"description":1017,"published":1018,"category":522,"image":1019,"draft":526},"\u002Fblog\u002Fcors-wildcard-security-risk","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist nicht.","Ist eine CORS-Wildcard ein Sicherheitsrisiko? Meist ist sie die Voreinstellung deines Builders und gibt nichts preis, was dein Server nicht ohnehin herausgab.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":1021,"title":1022,"description":1023,"published":1024,"category":624,"image":1025,"draft":526},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Supabase Branching ist kein Backup. Es geht nur vorwärts.","Warum Supabase Branching kein Backup ist: Ein Branch startet ohne deine Daten, und ein Merge bringt nur das Schema. Wofür es gut ist und was stattdessen hilft.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":1027,"title":1028,"description":1029,"published":1030,"category":624,"image":1031,"draft":526},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Supabase-Backup wiederherstellen, und was danach kaputt ist","Wie du ein Supabase-Backup aus dem Dashboard oder aus einer Dump-Datei wiederherstellst, was ersetzt wird und warum die App danach kaputt sein kann.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":1033,"title":1034,"description":1035,"published":1036,"category":522,"image":1037,"draft":526},"\u002Fblog\u002Fsupabase-storage-bucket-public","Dein Supabase-Storage-Bucket ist öffentlich. Ist das ein Problem?","Ein öffentlicher Supabase-Storage-Bucket heißt: Wer die URL einer Datei hat, kann sie öffnen. Er heißt nicht, dass jemand den Inhalt auflisten darf.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":1039,"title":1040,"description":1041,"published":1042,"category":522,"image":1043,"draft":526},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Ist ein Google-API-Schlüssel im Frontend ein Problem?","Ein Google-API-Schlüssel im Frontend ist der Fund unseres Scanners Nummer eins, und meistens unbedenklich. Eine kostenlose Einstellung entscheidet darüber.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":1045,"title":1046,"description":1047,"published":1048,"category":624,"image":1049,"draft":526},"\u002Fblog\u002Fai-agent-deleted-my-database","Ein KI-Agent hat meine Supabase-Daten gelöscht. Was hole ich zurück?","Ein KI-Agent hat Daten aus deiner Datenbank gelöscht. Was du zurückholst, stand schon vorher fest, und die nächsten Minuten entscheiden über den Rest.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":1051,"title":1052,"description":1053,"published":1054,"category":522,"image":1055,"draft":526},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Kann jeder deine Supabase-Datenbank lesen? 3.680 Apps im Test","Kann jeder deine Supabase-Datenbank ohne Login lesen? Wir haben 30.998 aktive Apps aus KI-Buildern gescannt und gemessen, wie oft die Antwort ja lautet.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":1057,"title":1058,"description":1059,"published":1054,"category":522,"image":1060,"draft":526},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source-Maps öffentlich: deine App veröffentlicht ihren Quellcode","Eine öffentliche Source-Map lässt jeden den Originalcode deiner App lesen, Kommentare inklusive. Der 30-Sekunden-Check, und was wirklich zählt.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":1062,"title":1063,"description":1064,"published":1065,"category":522,"image":1066,"draft":526},"\u002Fblog\u002Fsupabase-new-api-keys","Supabase publishable key: ist er derselbe wie der anon key?","Supabase hat anon und service_role durch öffentliche und geheime Schlüssel ersetzt. Welcher gehört in deine App, und welcher nie?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":1068,"title":1069,"description":1070,"published":1071,"category":624,"image":1072,"draft":526},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","Sichert Supabase meine Datenbank? Das hängt von deinem Tarif ab.","Sichert Supabase deine Datenbank? Auf bezahlten Tarifen täglich, im Gratis-Tarif gar nicht. So findest du heraus, was du hast und was es nicht abdeckt.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":1074,"title":1075,"description":1076,"published":1077,"category":522,"image":1078,"draft":526},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","Supabase Row Level Security ist an. Die Tabelle ist trotzdem offen.","Supabase Row Level Security anzuschalten schützt keine Tabelle. Erst deine Policies tun das, und die, die deine App repariert hat, lässt oft alle herein.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":1080,"title":1081,"description":1082,"published":1077,"category":624,"image":1083,"draft":526},"\u002Fblog\u002Fversion-history-is-not-a-backup","Der Versionsverlauf ist kein Backup. Er holt keine Tabelle zurück.","Lovable und Bolt führen einen Versionsverlauf für deinen Code. Deine Datenbank ist ein eigener Dienst, und ein Rücksprung holt deine Daten nicht zurück.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":1085,"title":1086,"description":1087,"published":1088,"category":624,"image":1089,"draft":526},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Drei Wege, eine Supabase-Datenbank zu sichern, und was fehlt","Das Dashboard, pg_dump und ein verwalteter Dienst. Was jeder Weg wirklich sichert, was er stillschweigend auslässt und welcher den Kontoverlust übersteht.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":1091,"title":1092,"description":1093,"published":1088,"category":522,"image":1094,"draft":526},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Welche API-Schlüssel im Frontend sicher sind, und welche nicht","Dein Supabase-anon-Schlüssel darf öffentlich sein. Der service_role-Schlüssel nicht. Er ignoriert jede Regel, die du setzt. So erkennst du den Unterschied.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1794213638616]