[{"data":1,"prerenderedAt":548},["ShallowReactive",2],{"footer-compare-de":3,"dynamicForm-newsletter-de":24,"mdc--4uzlmi-key":55,"\u002Fde\u002Farchitecture\u002Fsecurity-de":77},[4,8,12,16,20],{"path":5,"competitorName":6,"title":7},"\u002Fmake","Make","dataflows vs Make",{"path":9,"competitorName":10,"title":11},"\u002Fpipedream","Pipedream","dataflows vs Pipedream",{"path":13,"competitorName":14,"title":15},"\u002Fpower-automate","Power Automate","dataflows vs Power Automate",{"path":17,"competitorName":18,"title":19},"\u002Fzapier","Zapier","dataflows vs Zapier",{"path":21,"competitorName":22,"title":23},"\u002Fn8n","n8n","dataflows vs n8n",{"id":25,"title":26,"apiEndpoint":27,"body":28,"description":28,"extension":29,"fields":30,"mail":43,"meta":46,"navigation":35,"path":47,"seo":48,"stem":49,"submitButtonLabel":50,"successMsg":51,"__hash__":54},"forms_de\u002Fnewsletter.yml","Newsletter","\u002Fapi\u002FdynamicFormsInbox",null,"yml",[31,38],{"name":32,"type":32,"label":33,"placeholder":34,"required":35,"validationError":36,"width":37},"email","E-Mail","deine@email.de",true,"Bitte gib eine gültige E-Mail-Adresse an","full",{"name":39,"type":40,"label":41,"required":35,"validationError":42,"width":37},"privacy","checkbox","Ich stimme der [Datenschutzerklärung](\u002Fde\u002Fprivacy) zu","Bitte stimme der Datenschutzerklärung zu",{"to":44,"subject":45},"info@nbrx.com","Neues Newsletter-Abo",{},"\u002Fnewsletter",{"title":26},"newsletter","Abonnieren",{"title":52,"description":53},"Fast geschafft","Wir haben dir eine Bestätigungs-E-Mail geschickt – bitte schau kurz rein.","revae07UJt6EZkkQ6uf8RmCpu7w1TTPocdQKkKUB2LQ",{"data":56,"body":57},{},{"type":58,"children":59},"root",[60],{"type":61,"tag":62,"props":63,"children":64},"element","p",{},[65,68,75],{"type":66,"value":67},"text","Ich stimme der ",{"type":61,"tag":69,"props":70,"children":72},"a",{"href":71},"\u002Fde\u002Fprivacy",[73],{"type":66,"value":74},"Datenschutzerklärung",{"type":66,"value":76}," zu",{"id":78,"title":79,"body":80,"description":538,"extension":539,"icon":540,"meta":541,"navigation":35,"path":542,"seo":543,"stem":546,"__hash__":547},"architecture_de\u002Fsecurity.md","Sicherheit & Auth",{"type":81,"value":82,"toc":529},"minimark",[83,88,91,101,107,136,140,143,167,171,174,504,508,511,525],[84,85,87],"h2",{"id":86},"token-management","Token-Management",[62,89,90],{},"Der Umgang mit OAuth2-Tokens ist komplex. dataflows abstrahiert das vollständig weg.",[92,93,95,96,100],"h3",{"id":94},"die-connections-tabelle","Die ",[97,98,99],"code",{},"connections","-Tabelle",[62,102,103,104,106],{},"Tokens werden in der ",[97,105,99],{},"-Tabelle gespeichert.",[108,109,110,126],"ul",{},[111,112,113,117,118,121,122,125],"li",{},[114,115,116],"strong",{},"Verschlüsselung",": ",[97,119,120],{},"access_token"," und ",[97,123,124],{},"refresh_token"," werden mit AES-256-GCM verschlüsselt, bevor sie in die Datenbank geschrieben werden.",[111,127,128,131,132,135],{},[114,129,130],{},"Auto-Refresh",": Die Engine prüft automatisch ",[97,133,134],{},"expires_at"," und erneuert den Token, bevor ein Workflow-Schritt läuft.",[92,137,139],{"id":138},"service-clients","Service-Clients",[62,141,142],{},"Wir trennen die „Application“ (Service-Client) vom „User“ (Connection).",[108,144,145,158],{},[111,146,147,150,151,121,154,157],{},[114,148,149],{},"Service-Client",": Enthält ",[97,152,153],{},"client_id",[97,155,156],{},"client_secret",".",[111,159,160,163,164,166],{},[114,161,162],{},"Connection",": Enthält das ",[97,165,120],{}," des Users.",[84,168,170],{"id":169},"dependency-injection","Dependency Injection",[62,172,173],{},"Workflows greifen nie direkt auf Secrets zu. Die Engine injiziert vorauthentifizierte Clients in jeden Schritt.",[175,176,181],"pre",{"className":177,"code":178,"language":179,"meta":180,"style":180},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ❌ SCHLECHT: Tokens manuell handhaben\nconst token = await db.tokens.find(...)\nawait fetch('https:\u002F\u002Fapi.github.com', {\n  headers: { Authorization: token }\n})\n\n\u002F\u002F ✅ GUT: Authentifizierter Client von der Engine injiziert\nexport const syncIssues = defineWorkflow({\n  id: 'sync-github-issues',\n  trigger: schedule.every('1h'),\n\n  async run({ step, clients }) {\n    \u002F\u002F Die Engine löst die Connection auf, erneuert Tokens\n    \u002F\u002F bei Bedarf und gibt dir einen einsatzbereiten Client.\n    return step.run('fetch-issues', () =>\n      clients.github.listIssues({ repo: 'dataflows-io\u002Fapp' })\n    )\n  }\n})\n","typescript","",[97,182,183,192,234,260,283,291,297,303,325,344,374,379,405,411,417,447,485,491,497],{"__ignoreMap":180},[184,185,188],"span",{"class":186,"line":187},"line",1,[184,189,191],{"class":190},"sHwdD","\u002F\u002F ❌ SCHLECHT: Tokens manuell handhaben\n",[184,193,195,199,203,207,211,214,216,219,221,225,228,231],{"class":186,"line":194},2,[184,196,198],{"class":197},"spNyl","const",[184,200,202],{"class":201},"sTEyZ"," token ",[184,204,206],{"class":205},"sMK4o","=",[184,208,210],{"class":209},"s7zQu"," await",[184,212,213],{"class":201}," db",[184,215,157],{"class":205},[184,217,218],{"class":201},"tokens",[184,220,157],{"class":205},[184,222,224],{"class":223},"s2Zo4","find",[184,226,227],{"class":201},"(",[184,229,230],{"class":205},"...",[184,232,233],{"class":201},")\n",[184,235,237,240,243,245,248,252,254,257],{"class":186,"line":236},3,[184,238,239],{"class":209},"await",[184,241,242],{"class":223}," fetch",[184,244,227],{"class":201},[184,246,247],{"class":205},"'",[184,249,251],{"class":250},"sfazB","https:\u002F\u002Fapi.github.com",[184,253,247],{"class":205},[184,255,256],{"class":205},",",[184,258,259],{"class":205}," {\n",[184,261,263,267,270,273,276,278,280],{"class":186,"line":262},4,[184,264,266],{"class":265},"swJcz","  headers",[184,268,269],{"class":205},":",[184,271,272],{"class":205}," {",[184,274,275],{"class":265}," Authorization",[184,277,269],{"class":205},[184,279,202],{"class":201},[184,281,282],{"class":205},"}\n",[184,284,286,289],{"class":186,"line":285},5,[184,287,288],{"class":205},"}",[184,290,233],{"class":201},[184,292,294],{"class":186,"line":293},6,[184,295,296],{"emptyLinePlaceholder":35},"\n",[184,298,300],{"class":186,"line":299},7,[184,301,302],{"class":190},"\u002F\u002F ✅ GUT: Authentifizierter Client von der Engine injiziert\n",[184,304,306,309,312,315,317,320,322],{"class":186,"line":305},8,[184,307,308],{"class":209},"export",[184,310,311],{"class":197}," const",[184,313,314],{"class":201}," syncIssues ",[184,316,206],{"class":205},[184,318,319],{"class":223}," defineWorkflow",[184,321,227],{"class":201},[184,323,324],{"class":205},"{\n",[184,326,328,331,333,336,339,341],{"class":186,"line":327},9,[184,329,330],{"class":265},"  id",[184,332,269],{"class":205},[184,334,335],{"class":205}," '",[184,337,338],{"class":250},"sync-github-issues",[184,340,247],{"class":205},[184,342,343],{"class":205},",\n",[184,345,347,350,352,355,357,360,362,364,367,369,372],{"class":186,"line":346},10,[184,348,349],{"class":265},"  trigger",[184,351,269],{"class":205},[184,353,354],{"class":201}," schedule",[184,356,157],{"class":205},[184,358,359],{"class":223},"every",[184,361,227],{"class":201},[184,363,247],{"class":205},[184,365,366],{"class":250},"1h",[184,368,247],{"class":205},[184,370,371],{"class":201},")",[184,373,343],{"class":205},[184,375,377],{"class":186,"line":376},11,[184,378,296],{"emptyLinePlaceholder":35},[184,380,382,385,388,391,395,397,400,403],{"class":186,"line":381},12,[184,383,384],{"class":197},"  async",[184,386,387],{"class":265}," run",[184,389,390],{"class":205},"({",[184,392,394],{"class":393},"sHdIc"," step",[184,396,256],{"class":205},[184,398,399],{"class":393}," clients",[184,401,402],{"class":205}," })",[184,404,259],{"class":205},[184,406,408],{"class":186,"line":407},13,[184,409,410],{"class":190},"    \u002F\u002F Die Engine löst die Connection auf, erneuert Tokens\n",[184,412,414],{"class":186,"line":413},14,[184,415,416],{"class":190},"    \u002F\u002F bei Bedarf und gibt dir einen einsatzbereiten Client.\n",[184,418,420,423,425,427,430,432,434,437,439,441,444],{"class":186,"line":419},15,[184,421,422],{"class":209},"    return",[184,424,394],{"class":201},[184,426,157],{"class":205},[184,428,429],{"class":223},"run",[184,431,227],{"class":265},[184,433,247],{"class":205},[184,435,436],{"class":250},"fetch-issues",[184,438,247],{"class":205},[184,440,256],{"class":205},[184,442,443],{"class":205}," ()",[184,445,446],{"class":197}," =>\n",[184,448,450,453,455,458,460,463,465,468,471,473,475,478,480,483],{"class":186,"line":449},16,[184,451,452],{"class":201},"      clients",[184,454,157],{"class":205},[184,456,457],{"class":201},"github",[184,459,157],{"class":205},[184,461,462],{"class":223},"listIssues",[184,464,227],{"class":265},[184,466,467],{"class":205},"{",[184,469,470],{"class":265}," repo",[184,472,269],{"class":205},[184,474,335],{"class":205},[184,476,477],{"class":250},"dataflows-io\u002Fapp",[184,479,247],{"class":205},[184,481,482],{"class":205}," }",[184,484,233],{"class":265},[184,486,488],{"class":186,"line":487},17,[184,489,490],{"class":265},"    )\n",[184,492,494],{"class":186,"line":493},18,[184,495,496],{"class":205},"  }\n",[184,498,500,502],{"class":186,"line":499},19,[184,501,288],{"class":205},[184,503,233],{"class":201},[84,505,507],{"id":506},"isolation","Isolation",[62,509,510],{},"Jede Workflow-Execution läuft in einem isolierten Kontext.",[108,512,513,519],{},[111,514,515,518],{},[114,516,517],{},"Environment-Variablen",": Secrets werden als Umgebungsvariablen injiziert.",[111,520,521,524],{},[114,522,523],{},"Netzwerk-Isolation",": Workflows können auf bestimmte Egress-Domains beschränkt werden.",[526,527,528],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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":180,"searchDepth":194,"depth":194,"links":530},[531,536,537],{"id":86,"depth":194,"text":87,"children":532},[533,535],{"id":94,"depth":236,"text":534},"Die connections-Tabelle",{"id":138,"depth":236,"text":139},{"id":169,"depth":194,"text":170},{"id":506,"depth":194,"text":507},"Wie dataflows Secrets, Tokens und Berechtigungen handhabt.","md","i-lucide-lock",{},"\u002Fsecurity",{"title":544,"description":545},"Sicherheits-Architektur","Security first. So schützen wir deine Tokens und Daten.","security","cQq-funNgCGtDOUwFQfrtYl_K3t4KNh48SzCGWk37gc",1776797949857]