[{"data":1,"prerenderedAt":525},["ShallowReactive",2],{"page:\u002Fextensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication":3},{"id":4,"title":5,"body":6,"description":506,"extension":514,"frontmatter":515,"heading":5,"meta":516,"navigation":517,"order":518,"path":519,"seo":520,"sitemap":521,"source":4,"stem":522,"__hash__":523,"hasPopups":524},"extensions\u002Fextensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication.md","Authenticate",{"type":7,"value":8,"toc":505},"minimark",[9,18,27,33,121,127,131,142,447,451,461,502],[10,11,12,13,17],"p",{},"Auth lives in your ",[14,15,16],"code",{},"client",". The plugin does not send credentials itself. It tells your client which schemes each operation needs, and your client decides what to do.",[19,20,22,23,26],"h2",{"id":21},"the-security-list","The ",[14,24,25],{},"security"," list",[10,28,29,30,32],{},"Each generated function passes the operation's security schemes from the spec as ",[14,31,25],{},":",[34,35,39],"pre",{"language":36,"code":37,"class":38},"typescript","request({\n  method: 'GET',\n  url: '\u002Fpet\u002F{petId}',\n  security: [{ type: 'apiKey', name: 'api_key', in: 'header' }, { type: 'oauth2' }],\n  ...config,\n})","shiki shiki-themes github-light github-dark dark:github-dark",[14,40,42,55,56,55,68,55,78,55,107,55,116],{"class":41},"language-typescript",[43,44,47,51],"span",{"class":45,"style":46},"line","display: inline",[43,48,50],{"style":49},"color:#6F42C1;--shiki-dark:#B392F0","request",[43,52,54],{"style":53},"color:#24292E;--shiki-dark:#E1E4E8","({","\n",[43,57,58,61,65],{"class":45,"style":46},[43,59,60],{"style":53},"  method: ",[43,62,64],{"style":63},"color:#032F62;--shiki-dark:#9ECBFF","'GET'",[43,66,67],{"style":53},",",[43,69,70,73,76],{"class":45,"style":46},[43,71,72],{"style":53},"  url: ",[43,74,75],{"style":63},"'\u002Fpet\u002F{petId}'",[43,77,67],{"style":53},[43,79,80,83,86,89,92,95,98,101,104],{"class":45,"style":46},[43,81,82],{"style":53},"  security: [{ type: ",[43,84,85],{"style":63},"'apiKey'",[43,87,88],{"style":53},", name: ",[43,90,91],{"style":63},"'api_key'",[43,93,94],{"style":53},", in: ",[43,96,97],{"style":63},"'header'",[43,99,100],{"style":53}," }, { type: ",[43,102,103],{"style":63},"'oauth2'",[43,105,106],{"style":53}," }],",[43,108,109,113],{"class":45,"style":46},[43,110,112],{"style":111},"color:#D73A49;--shiki-dark:#F97583","  ...",[43,114,115],{"style":53},"config,",[43,117,118],{"class":45,"style":46},[43,119,120],{"style":53},"})",[10,122,123,124,126],{},"An operation without security requirements passes no ",[14,125,25],{}," field. Use that to skip auth on public endpoints.",[19,128,130],{"id":129},"add-a-bearer-token-from-an-async-source","Add a bearer token from an async source",[10,132,133,134,137,138,141],{},"The client can ",[14,135,136],{},"await"," anything before it sends the request. The client below awaits a token function you register with ",[14,139,140],{},"setAuth",", so the token can come from a secrets store or a refresh call:",[143,144,145,406],"code-group",{},[34,146,149],{"language":36,"filename":147,"code":148,"class":38},"src\u002Fclient.ts","type GetToken = () => Promise\u003Cstring | undefined>\n\nlet getToken: GetToken | undefined\n\nexport function setAuth(resolve: GetToken) {\n  getToken = resolve\n}\n\nexport async function client(config: RequestConfig) {\n  const token = config.security?.length ? await getToken?.() : undefined\n\n  const response = await fetch(url, {\n    method: config.method,\n    headers: { ...(token ? { Authorization: `Bearer ${token}` } : {}), ...(config.headers as Record\u003Cstring, string>) },\n    \u002F\u002F ...\n  })\n  \u002F\u002F ...\n}",[14,150,151,55,187,55,189,55,205,55,207,55,232,55,243,55,248,55,250,55,274,55,305,55,307,55,324,55,329,55,386,55,392,55,397,55,402],{"class":41},[43,152,153,156,159,162,165,168,171,174,178,181,184],{"class":45,"style":46},[43,154,155],{"style":111},"type",[43,157,158],{"style":49}," GetToken",[43,160,161],{"style":111}," =",[43,163,164],{"style":53}," () ",[43,166,167],{"style":111},"=>",[43,169,170],{"style":49}," Promise",[43,172,173],{"style":53},"\u003C",[43,175,177],{"style":176},"color:#005CC5;--shiki-dark:#79B8FF","string",[43,179,180],{"style":111}," |",[43,182,183],{"style":176}," undefined",[43,185,186],{"style":53},">",[43,188],{"class":45,"style":46},[43,190,191,194,197,199,201,203],{"class":45,"style":46},[43,192,193],{"style":111},"let",[43,195,196],{"style":53}," getToken",[43,198,32],{"style":111},[43,200,158],{"style":49},[43,202,180],{"style":111},[43,204,183],{"style":176},[43,206],{"class":45,"style":46},[43,208,209,212,215,218,221,225,227,229],{"class":45,"style":46},[43,210,211],{"style":111},"export",[43,213,214],{"style":111}," function",[43,216,217],{"style":49}," setAuth",[43,219,220],{"style":53},"(",[43,222,224],{"style":223},"color:#E36209;--shiki-dark:#FFAB70","resolve",[43,226,32],{"style":111},[43,228,158],{"style":49},[43,230,231],{"style":53},") {",[43,233,234,237,240],{"class":45,"style":46},[43,235,236],{"style":53},"  getToken ",[43,238,239],{"style":111},"=",[43,241,242],{"style":53}," resolve",[43,244,245],{"class":45,"style":46},[43,246,247],{"style":53},"}",[43,249],{"class":45,"style":46},[43,251,252,254,257,259,262,264,267,269,272],{"class":45,"style":46},[43,253,211],{"style":111},[43,255,256],{"style":111}," async",[43,258,214],{"style":111},[43,260,261],{"style":49}," client",[43,263,220],{"style":53},[43,265,266],{"style":223},"config",[43,268,32],{"style":111},[43,270,271],{"style":49}," RequestConfig",[43,273,231],{"style":53},[43,275,276,279,282,284,287,290,293,296,298,301,303],{"class":45,"style":46},[43,277,278],{"style":111},"  const",[43,280,281],{"style":176}," token",[43,283,161],{"style":111},[43,285,286],{"style":53}," config.security?.",[43,288,289],{"style":176},"length",[43,291,292],{"style":111}," ?",[43,294,295],{"style":111}," await",[43,297,196],{"style":49},[43,299,300],{"style":53},"?.() ",[43,302,32],{"style":111},[43,304,183],{"style":176},[43,306],{"class":45,"style":46},[43,308,309,311,314,316,318,321],{"class":45,"style":46},[43,310,278],{"style":111},[43,312,313],{"style":176}," response",[43,315,161],{"style":111},[43,317,295],{"style":111},[43,319,320],{"style":49}," fetch",[43,322,323],{"style":53},"(url, {",[43,325,326],{"class":45,"style":46},[43,327,328],{"style":53},"    method: config.method,",[43,330,331,334,337,340,343,346,349,352,355,358,360,363,365,368,371,374,376,378,381,383],{"class":45,"style":46},[43,332,333],{"style":53},"    headers: { ",[43,335,336],{"style":111},"...",[43,338,339],{"style":53},"(token ",[43,341,342],{"style":111},"?",[43,344,345],{"style":53}," { Authorization: ",[43,347,348],{"style":63},"`Bearer ${",[43,350,351],{"style":53},"token",[43,353,354],{"style":63},"}`",[43,356,357],{"style":53}," } ",[43,359,32],{"style":111},[43,361,362],{"style":53}," {}), ",[43,364,336],{"style":111},[43,366,367],{"style":53},"(config.headers ",[43,369,370],{"style":111},"as",[43,372,373],{"style":49}," Record",[43,375,173],{"style":53},[43,377,177],{"style":176},[43,379,380],{"style":53},", ",[43,382,177],{"style":176},[43,384,385],{"style":53},">) },",[43,387,388],{"class":45,"style":46},[43,389,391],{"style":390},"color:#6A737D;--shiki-dark:#6A737D","    \u002F\u002F ...",[43,393,394],{"class":45,"style":46},[43,395,396],{"style":53},"  })",[43,398,399],{"class":45,"style":46},[43,400,401],{"style":390},"  \u002F\u002F ...",[43,403,404],{"class":45,"style":46},[43,405,247],{"style":53},[34,407,410],{"language":36,"filename":408,"code":409,"class":38},"src\u002Findex.ts","import { setAuth } from '.\u002Fclient'\n\nsetAuth(async () => readTokenFromSecretsStore())",[14,411,412,55,426,55,428],{"class":41},[43,413,414,417,420,423],{"class":45,"style":46},[43,415,416],{"style":111},"import",[43,418,419],{"style":53}," { setAuth } ",[43,421,422],{"style":111},"from",[43,424,425],{"style":63}," '.\u002Fclient'",[43,427],{"class":45,"style":46},[43,429,430,432,434,437,439,441,444],{"class":45,"style":46},[43,431,140],{"style":49},[43,433,220],{"style":53},[43,435,436],{"style":111},"async",[43,438,164],{"style":53},[43,440,167],{"style":111},[43,442,443],{"style":49}," readTokenFromSecretsStore",[43,445,446],{"style":53},"())",[19,448,450],{"id":449},"sign-requests-or-use-several-auth-methods","Sign requests or use several auth methods",[10,452,453,454,457,458,460],{},"Read ",[14,455,456],{},"config.security"," and pick per operation, or pass a different ",[14,459,16],{}," on a call. This works for request signing, such as AWS SigV4, and for services that use different credentials:",[34,462,464],{"language":36,"code":463,"class":38},"import { createSignedClient } from '.\u002Fclients\u002Fiam'\n\nawait getPetById({ path: { petId: 1 }, client: createSignedClient() })",[14,465,466,55,478,55,480],{"class":41},[43,467,468,470,473,475],{"class":45,"style":46},[43,469,416],{"style":111},[43,471,472],{"style":53}," { createSignedClient } ",[43,474,422],{"style":111},[43,476,477],{"style":63}," '.\u002Fclients\u002Fiam'",[43,479],{"class":45,"style":46},[43,481,482,484,487,490,493,496,499],{"class":45,"style":46},[43,483,136],{"style":111},[43,485,486],{"style":49}," getPetById",[43,488,489],{"style":53},"({ path: { petId: ",[43,491,492],{"style":176},"1",[43,494,495],{"style":53}," }, client: ",[43,497,498],{"style":49},"createSignedClient",[43,500,501],{"style":53},"() })",[10,503,504],{},"A client passed on a call replaces the default for that call only.",{"title":506,"searchDepth":507,"depth":507,"links":508},"",5,[509,512,513],{"id":21,"depth":510,"text":511},2,"The security list",{"id":129,"depth":510,"text":130},{"id":449,"depth":510,"text":450},"md",{},{},true,null,"\u002Fextensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication",{"title":5},{"loc":519},"extensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication","32qoB6Lgko7IIgudy0yXZHddEoHI7BKDNIhr6CxbRMo",false,1792750771416]