PageSourceSearch

https://fusedata.dev/_next/static/chunks/pages/docs/server/authorization-e53782d0cee13ae6.js

js fusedata.dev collected 2026-10-05 22:52:41 UTC 28,882 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[388],{2335:function(e,s,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/docs/server/authorization",function(){return n(2863)}])},2863:function(e,s,n){"use strict";n.r(s),n.d(s,{__toc:function(){return a}});var o=n(5250),r=n(8720),i=n(5074),t=n(6965);n(664);var l=n(2318);let a=[{depth:2,value:"Setting up",id:"setting-up"},{depth:2,value:"Using scopes",id:"using-scopes"}];function c(e){let s=Object.assign({h1:"h1",p:"p",code:"code",h2:"h2",pre:"pre",span:"span",a:"a",blockquote:"blockquote"},(0,l.a)(),e.components);return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.h1,{children:"Authorization"}),"\n",(0,o.jsx)(s.p,{children:"In some cases you might not wish to fully rely on your datasource to perform\nauthorization like in the case of a database or you want to optimise to terminate\nrequests as soon as possible."}),"\n",(0,o.jsxs)(s.p,{children:["In these cases you can use ",(0,o.jsx)(s.code,{children:"auth-scopes"})," to perform authorization both on the field- as well\nas type-level."]}),"\n",(0,o.jsx)(s.h2,{id:"setting-up",children:"Setting up"}),"\n",(0,o.jsxs)(s.p,{children:["To use the ",(0,o.jsx)(s.code,{children:"auth-scopes"})," we'll need to create a new file in ",(0,o.jsx)(s.code,{children:"types/"})," where we'll\ndefine the type for our scope as well as how to resolve it."]}),"\n",(0,o.jsx)(s.pre,{"data-language":"ts","data-theme":"default",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"default",children:[(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fuse'"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { defineAuthScopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" Scopes } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fuse'"})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:" "}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"declare"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"module"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fuse'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"export"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"interface"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Scopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    isLoggedIn"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"boolean"})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  }"})}),"\n",(0,o.jsx)(s.span,{className:"line",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"}"})}),"\n",(0,o.jsx)(s.span,{className:"line",children:" "}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"defineAuthScopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"<"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Scopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:">((ctx) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ({"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  isLoggedIn"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!!"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ctx"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:".user"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  isAdmin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"!!"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ctx"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:".admin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"canAccessUser"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" (userId) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"ctx"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"."}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"allowedIds"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".includes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(userId)"})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"}))"})})]})}),"\n",(0,o.jsxs)(s.p,{children:["In the above we define three scopes. The scopes ",(0,o.jsx)(s.code,{children:"isLoggedIn"})," and ",(0,o.jsx)(s.code,{children:"isAdmin"})," allow us to\nrestrict access to types or fields based on the users role - anonymous, logged in and/or admin.\nThe scope ",(0,o.jsx)(s.code,{children:"canAccessUser"})," takes a parameter. The parameter allows us to dynamically restrict\naccess to individual instances of a type. For example a user should be able to access ",(0,o.jsx)(s.code,{children:"Query.user"}),"\nfor them selves and their colleagues, but not for user ids outside of their own organisation."]}),"\n",(0,o.jsxs)(s.p,{children:["An important note here is that we are using ",(0,o.jsx)(s.a,{href:"./context",children:"the context"})," to setup these scopes.\nTherefore we must define the ",(0,o.jsx)(s.code,{children:"user"})," and ",(0,o.jsx)(s.code,{children:"allowedIds"}
1)," on the context when we are\nexecuting our request."]}),"\n",(0,o.jsx)(s.h2,{id:"using-scopes",children:"Using scopes"}),"\n",(0,o.jsx)(s.p,{children:"Now that we have defined our scopes we can use them in our schema"}),"\n",(0,o.jsx)(s.pre,{"data-language":"ts","data-theme":"default",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"default",children:[(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { node } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fuse'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:" "}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"const"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"UserNode"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" node"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"<"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  UserSource"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:">"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'User'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// These functions allow you to do full logic i.e. you can also return"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// scopes conditionally based on some super-admin privilege where you"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// just do return true; instead of return {}"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"authScopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" (parent"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" args) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ({ canAccessUser"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"parent"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:".id "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"||"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"args"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:".id })"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"load"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"async"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" (ids) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"getUsers"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(ids)"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"fields"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" (t) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ({"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    name"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"t"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exposeString"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'name'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    avatarUrl"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"t"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exposeString"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'avatarUrl'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    secretField"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"t"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".exposeString"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'secretField'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"      authScopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { isAdmin"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    })"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  })"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"})"})})]})}),"\n",(0,o.jsxs)(s.p,{children:["Now anytime we query ",(0,o.jsx)(s.code,{children:"Query.node(id: ID!)"})," or ",(0,o.jsx)(s.code,{children:"Query.user(id: ID!)"})," we will check if the\nconsumer of said request is allowed to access a given ",(0,o.jsx)(s.code,{children:"id"}),". When we request ",(0,o.jsx)(s.code,{children:"secretField"}),"\nwe will check if the consumer is an admin, if they're not but they are allowed to access the user\nbecause it's a nullable field it will show up as ",(0,o.jsx)(s.code,{children:"null"})," but the other fields will be resolved\ncorrectly."]}),"\n",(0,o.jsx)(s.p,{children:"We can also define our scopes on the query-field level:"}),"\n",(0,o.jsx)(s.pre,{"data-language":"ts","data-theme":"default",children:(0,o.jsxs)(s.code,{"data-language":"ts","data-theme":"default",children:[(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { addQueryFields } "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'fuse'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:" "}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"addQueryFields"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"((t) "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ({"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  me"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"t"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:".field"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"({"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    type"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"'User'"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    authScopes"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"      isLoggedIn"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"resolve"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" () "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"=>"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"      "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"return"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"true"})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    }"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsxs)(s.span,{className:"line",children:[(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  })"}),(0,o.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,o.jsx)(s.span,{className:"line",children:(0,o.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"}))"})})]})}),"\n",(0,o.jsxs)(s.blockquote,{children:["\n",(0,o.jsx)(s.p,{children:"Note that using complex values as an input to auth-scope functions will result in\nlower performance as we can't generate effective cache-keys for them."}),"\n"]})]})}let d={MDXContent:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,l.a)(),e.components);return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(c,{...e})}):c(e)},pageOpts:{filePath:"src/pages/docs/server/authorization.mdx",route:"/docs/server/authorization",pageMap:[{kind:"Meta",data:{index:{type:"page",title:"Fuse",dis
1play:"hidden",theme:{layout:"full"}},docs:{type:"page",display:"hidden",title:"Documentation"}}},{kind:"Folder",name:"docs",route:"/docs",children:[{kind:"Meta",data:{index:"Getting Started",client:"Querying your API (client)",server:"Building your API (server)",deployment:"Deploying your API (server)","fuse-method":"The Fuse Method","setting-fuse-up-manually":"Setting up Fuse manually",troubleshooting:"Troubleshooting"}},{kind:"Folder",name:"client",route:"/docs/client",children:[{kind:"Meta",data:{index:"Overview","best-practices":"Best practices",types:"Types",javascript:"JavaScript frameworks",other:"Other languages"}},{kind:"MdxPage",name:"best-practices",route:"/docs/client/best-practices"},{kind:"MdxPage",name:"index",route:"/docs/client"},{kind:"Folder",name:"javascript",route:"/docs/client/javascript",children:[{kind:"Meta",data:{react:"React & React Native",nextjs:"Next.js",vue:"Vue",angular:"Angular"}},{kind:"MdxPage",name:"angular",route:"/docs/client/javascript/angular"},{kind:"MdxPage",name:"nextjs",route:"/docs/client/javascript/nextjs"},{kind:"MdxPage",name:"react",route:"/docs/client/javascript/react"},{kind:"MdxPage",name:"vue",route:"/docs/client/javascript/vue"}]},{kind:"Folder",name:"other",route:"/docs/client/other",children:[{kind:"Meta",data:{ios:"iOS",android:"Android (Java/Kotlin)",http:"HTTP"}},{kind:"MdxPage",name:"android",route:"/docs/client/other/android"},{kind:"MdxPage",name:"http",route:"/docs/client/other/http"},{kind:"MdxPage",name:"ios",route:"/docs/client/other/ios"}]},{kind:"MdxPage",name:"types",route:"/docs/client/types"}]},{kind:"Folder",name:"deployment",route:"/docs/deployment",children:[{kind:"Meta",data:{index:"Overview",node:"Node.js",lambda:"Lambda","cloudflare-workers":"Cloudflare Workers",nextjs:"Next.js API Routes",bun:"Bun"}},{kind:"MdxPage",name:"bun",route:"/docs/deployment/bun"},{kind:"MdxPage",name:"cloudflare-workers",route:"/docs/deployment/cloudflare-workers"},{kind:"MdxPage",name:"index",route:"/docs/deployment"},{kind:"MdxPage",name:"lambda",route:"/docs/deployment/lambda"},{kind:"MdxPage",name:"nextjs",route:"/docs/deployment/nextjs"},{kind:"MdxPage",name:"node",route:"/docs/deployment/node"}]},{kind:"Folder",name:"fuse-method",route:"/docs/fuse-method",children:[{kind:"Meta",data:{index:"Overview","vs-backend-for-frontends":"vs. Backend-for-Frontends","vs-graphql-federation":"vs. GraphQL Federation"}},{kind:"MdxPage",name:"index",route:"/docs/fuse-method"},{kind:"MdxPage",name:"vs-backend-for-frontends",route:"/docs/fuse-method/vs-backend-for-frontends"},{kind:"MdxPage",name:"vs-graphql-federation",route:"/docs/fuse-method/vs-graphql-federation"}]},{kind:"MdxPage",name:"index",route:"/docs"},{kind:"Folder",name:"server",route:"/docs/server",children:[{kind:"Meta",data:{"queries-and-mutations":"Queries and Mutations",nodes:"Nodes",lists:"Handling lists","objects-enums-unions-interfaces":"Objects, Enums, Unions, and Interfaces",context:"Context",integrations:"Integrating data sources","error-handling":"Error handling",authorization:"Authorization",mocking:"Mocking data"}},{kind:"MdxPage",name:"authorization",route:"/docs/server/authorization"},{kind:"MdxPage",name:"context",route:"/docs/server/context"},{kind:"MdxPage",name:"error-handling",route:"/docs/server/error-handling"},{kind:"Folder",name:"integrations",route:"/docs/server/integrations",children:[{kind:"Meta",data:{index:"Overview",rest:"REST",prisma:"Prisma",drizzle:"Drizzle",kysely:"Kysely",grpc:"gRPC"}},{kind:"MdxPage",name:"drizzle",route:"/docs/server/integrations/drizzle"},{kind:"MdxPage",name:"grpc",route:"/docs/server/integrations/grpc"},{kind:"MdxPage",name:"index",route:"/docs/server/integrations"},{kind:"MdxPage",name:"kysely",route:"/docs/server/integrations/kysely"},{kind:"MdxPage",name:"prisma",route:"/docs/server/integrations/prisma"},{kind:"MdxPage",name:"rest",route:"/docs/server/integrations/rest"}]},{kind:"MdxPage",name:"lists",route:"/docs/server/lists"},{kind:"MdxPage",name:"mocking",route:"/docs/server/mocking"},{kind:"MdxPage",name:"nodes",route:"/docs/server/nodes"},{kind:"MdxPage",name:"objects-enums-unions-interfaces",route:"/docs/server/objects-enums-unions-interfaces"},{kind:"MdxPage",name:"queries-and-mutations",route:"/docs/server/queries-and-mutations"}]},{kind:"Folder",name:"setting-fuse-up-manually",route:"/docs/setting-fuse-up-manually",children:[{kind:"Meta",data:{index:"Overview",nextjs:"Next.js Integration"}},{kind:"MdxPage",name:"index",route:"/docs/setting-fuse-up-manually"},{kind:"MdxPage",name:"nextjs",route:"/docs/setting-fuse-up-manually/nextjs"}]},{kind:"MdxPage",name:"troubleshooting",route:"/docs/troubleshooting"}]}],flexsearch:{codeblocks:!0},title:"Authorization",headings:a},pageNextRoute:"/docs/server/authorization",nextraLayout:i.ZP,themeConfig:t.Z};s.default=(0,r.j)(d)},6965:function(e,s,n){"use strict";var o=n(5250),r=n(5074),i=n(4427),t=n(2218),l=n(7216);let a={logo:(0,o.jsx)(t.L1,{}),primaryHue:88,primarySaturation:{light:50,dark:99},docsRepositoryBase:"https://github.com/StellateHQ/fuse/tree/main/website",useNextSeoProps:()=>({}),head:function(){let{asPath:e}=(0,i.useRouter)(),{frontMatter:s,title:n}=(0,r.ZR)();return(0,l.a)({title:n,url:"https://fusedata.dev"+e,description:s.description})},footer:{text:(0,o.jsxs)("span",{children:["\xa9 ",new Date().getFullYear()," ",(0,o.jsx)("a",{href:"https://stellate.co",target:"_blank",children:"Stellate, Inc"})]})},gitTimestamp:null};s.Z=a}},function(e){e.O(0,[169,417,139,774,888,179],function(){return e(e.s=2335)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.