[{"data":1,"prerenderedAt":641},["ShallowReactive",2],{"page:\u002Fextensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication":3},{"id":4,"frontmatter":5,"title":6,"heading":6,"body":7,"path":640,"source":4},"extensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication.md",{},"Authenticate",{"type":8,"value":9,"toc":631},"minimark",[10,19,28,34,168,174,178,189,552,556,566,628],[11,12,13,14,18],"p",{},"Auth lives in your ",[15,16,17],"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.",[20,21,23,24,27],"h2",{"id":22},"the-security-list","The ",[15,25,26],{},"security"," list",[11,29,30,31,33],{},"Each generated function passes the operation's security schemes from the spec as ",[15,32,26],{},":",[35,36,40],"pre",{"language":37,"code":38,"class":39},"typescript","request({\n  method: 'GET',\n  url: '\u002Fpet\u002F{petId}',\n  security: [{ type: 'apiKey', name: 'api_key', in: 'header' }, { type: 'oauth2' }],\n  ...config,\n})","highlights",[15,41,43,56,57,56,76,56,90,56,150,56,163],{"class":42},"language-typescript",[44,45,48,52],"span",{"class":46,"style":47},"line","display: inline",[44,49,51],{"style":50},"color:#6f42c1;--hls-dark:#b392f0","request",[44,53,55],{"style":54},"color:#005cc5;--hls-dark:#79b8ff","({","\n",[44,58,59,62,65,69,73],{"class":46,"style":47},[44,60,61],{"style":54},"  ",[44,63,64],{"style":54},"method",[44,66,68],{"style":67},"color:#d73a49;--hls-dark:#f97583",": ",[44,70,72],{"style":71},"color:#032f62;--hls-dark:#9ecbff","'GET'",[44,74,75],{"style":67},",",[44,77,78,80,83,85,88],{"class":46,"style":47},[44,79,61],{"style":67},[44,81,82],{"style":54},"url",[44,84,68],{"style":67},[44,86,87],{"style":71},"'\u002Fpet\u002F{petId}'",[44,89,75],{"style":67},[44,91,92,94,96,98,101,104,106,109,112,115,117,120,122,125,127,130,133,135,138,140,142,145,148],{"class":46,"style":47},[44,93,61],{"style":67},[44,95,26],{"style":54},[44,97,68],{"style":67},[44,99,100],{"style":54},"[{ ",[44,102,103],{"style":54},"type",[44,105,68],{"style":67},[44,107,108],{"style":71},"'apiKey'",[44,110,111],{"style":67},", ",[44,113,114],{"style":54},"name",[44,116,68],{"style":67},[44,118,119],{"style":71},"'api_key'",[44,121,111],{"style":67},[44,123,124],{"style":67},"in",[44,126,68],{"style":67},[44,128,129],{"style":71},"'header' ",[44,131,132],{"style":54},"}",[44,134,111],{"style":67},[44,136,137],{"style":54},"{ ",[44,139,103],{"style":54},[44,141,68],{"style":67},[44,143,144],{"style":71},"'oauth2' ",[44,146,147],{"style":54},"}]",[44,149,75],{"style":67},[44,151,152,154,157,161],{"class":46,"style":47},[44,153,61],{"style":67},[44,155,156],{"style":67},"...",[44,158,160],{"style":159},"color:#24292e;--hls-dark:#e1e4e8","config",[44,162,75],{"style":67},[44,164,165],{"class":46,"style":47},[44,166,167],{"style":54},"})",[11,169,170,171,173],{},"An operation without security requirements passes no ",[15,172,26],{}," field. Use that to skip auth on public endpoints.",[20,175,177],{"id":176},"add-a-bearer-token-from-an-async-source","Add a bearer token from an async source",[11,179,180,181,184,185,188],{},"The client can ",[15,182,183],{},"await"," anything before it sends the request. The client below awaits a token function you register with ",[15,186,187],{},"setAuth",", so the token can come from a secrets store or a refresh call:",[190,191,192,508],"code-group",{},[35,193,196],{"language":37,"filename":194,"code":195,"class":39},"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}",[15,197,198,56,233,56,235,56,251,56,253,56,277,56,288,56,292,56,294,56,316,56,357,56,359,56,384,56,401,56,484,56,492,56,498,56,504],{"class":42},[44,199,200,203,206,209,212,215,218,221,224,227,230],{"class":46,"style":47},[44,201,202],{"style":67},"type ",[44,204,205],{"style":50},"GetToken ",[44,207,208],{"style":67},"= ",[44,210,211],{"style":54},"() ",[44,213,214],{"style":67},"=> ",[44,216,217],{"style":50},"Promise",[44,219,220],{"style":67},"\u003C",[44,222,223],{"style":159},"string ",[44,225,226],{"style":67},"| ",[44,228,229],{"style":54},"undefined",[44,231,232],{"style":67},">",[44,234],{"class":46,"style":47},[44,236,237,240,243,245,247,249],{"class":46,"style":47},[44,238,239],{"style":67},"let ",[44,241,242],{"style":159},"getToken",[44,244,68],{"style":159},[44,246,205],{"style":50},[44,248,226],{"style":67},[44,250,229],{"style":54},[44,252],{"class":46,"style":47},[44,254,255,258,261,263,266,269,271,274],{"class":46,"style":47},[44,256,257],{"style":67},"export ",[44,259,260],{"style":67},"function ",[44,262,187],{"style":50},[44,264,265],{"style":54},"(",[44,267,268],{"style":159},"resolve",[44,270,68],{"style":159},[44,272,273],{"style":50},"GetToken",[44,275,276],{"style":54},") {",[44,278,279,281,284,286],{"class":46,"style":47},[44,280,61],{"style":54},[44,282,283],{"style":159},"getToken ",[44,285,208],{"style":67},[44,287,268],{"style":159},[44,289,290],{"class":46,"style":47},[44,291,132],{"style":54},[44,293],{"class":46,"style":47},[44,295,296,298,301,303,305,307,309,311,314],{"class":46,"style":47},[44,297,257],{"style":67},[44,299,300],{"style":67},"async ",[44,302,260],{"style":67},[44,304,17],{"style":50},[44,306,265],{"style":54},[44,308,160],{"style":159},[44,310,68],{"style":159},[44,312,313],{"style":50},"RequestConfig",[44,315,276],{"style":54},[44,317,318,320,323,326,328,330,333,335,338,341,344,347,349,351,353,355],{"class":46,"style":47},[44,319,61],{"style":54},[44,321,322],{"style":67},"const ",[44,324,325],{"style":159},"token ",[44,327,208],{"style":67},[44,329,160],{"style":159},[44,331,332],{"style":67},".",[44,334,26],{"style":54},[44,336,337],{"style":67},"?.",[44,339,340],{"style":54},"length ",[44,342,343],{"style":67},"? ",[44,345,346],{"style":67},"await ",[44,348,242],{"style":159},[44,350,337],{"style":67},[44,352,211],{"style":54},[44,354,68],{"style":67},[44,356,229],{"style":54},[44,358],{"class":46,"style":47},[44,360,361,363,365,368,370,372,375,377,379,381],{"class":46,"style":47},[44,362,61],{"style":54},[44,364,322],{"style":67},[44,366,367],{"style":159},"response ",[44,369,208],{"style":67},[44,371,346],{"style":67},[44,373,374],{"style":50},"fetch",[44,376,265],{"style":54},[44,378,82],{"style":159},[44,380,111],{"style":67},[44,382,383],{"style":54},"{",[44,385,386,389,391,393,395,397,399],{"class":46,"style":47},[44,387,388],{"style":54},"    ",[44,390,64],{"style":54},[44,392,68],{"style":67},[44,394,160],{"style":159},[44,396,332],{"style":67},[44,398,64],{"style":54},[44,400,75],{"style":67},[44,402,403,405,408,410,412,414,416,418,420,422,425,427,430,433,436,438,441,444,446,449,451,453,455,457,459,462,465,468,470,473,475,477,479,482],{"class":46,"style":47},[44,404,388],{"style":67},[44,406,407],{"style":54},"headers",[44,409,68],{"style":67},[44,411,137],{"style":54},[44,413,156],{"style":67},[44,415,265],{"style":54},[44,417,325],{"style":159},[44,419,343],{"style":67},[44,421,137],{"style":54},[44,423,424],{"style":54},"Authorization",[44,426,68],{"style":67},[44,428,429],{"style":71},"`Bearer ",[44,431,432],{"style":159},"${",[44,434,435],{"style":159},"token",[44,437,132],{"style":159},[44,439,440],{"style":71},"` ",[44,442,443],{"style":54},"} ",[44,445,68],{"style":67},[44,447,448],{"style":54},"{})",[44,450,111],{"style":67},[44,452,156],{"style":67},[44,454,265],{"style":54},[44,456,160],{"style":159},[44,458,332],{"style":67},[44,460,461],{"style":54},"headers ",[44,463,464],{"style":67},"as ",[44,466,467],{"style":50},"Record",[44,469,220],{"style":67},[44,471,472],{"style":159},"string",[44,474,111],{"style":67},[44,476,472],{"style":159},[44,478,232],{"style":67},[44,480,481],{"style":54},") }",[44,483,75],{"style":67},[44,485,486,488],{"class":46,"style":47},[44,487,388],{"style":67},[44,489,491],{"style":490},"color:#6a737d;--hls-dark:#6a737d","\u002F\u002F ...",[44,493,494,496],{"class":46,"style":47},[44,495,61],{"style":490},[44,497,167],{"style":54},[44,499,500,502],{"class":46,"style":47},[44,501,61],{"style":54},[44,503,491],{"style":490},[44,505,506],{"class":46,"style":47},[44,507,132],{"style":54},[35,509,512],{"language":37,"filename":510,"code":511,"class":39},"src\u002Findex.ts","import { setAuth } from '.\u002Fclient'\n\nsetAuth(async () => readTokenFromSecretsStore())",[15,513,514,56,532,56,534],{"class":42},[44,515,516,519,521,524,526,529],{"class":46,"style":47},[44,517,518],{"style":67},"import ",[44,520,137],{"style":54},[44,522,523],{"style":159},"setAuth ",[44,525,443],{"style":54},[44,527,528],{"style":67},"from ",[44,530,531],{"style":71},"'.\u002Fclient'",[44,533],{"class":46,"style":47},[44,535,536,538,540,542,544,546,549],{"class":46,"style":47},[44,537,187],{"style":50},[44,539,265],{"style":54},[44,541,300],{"style":67},[44,543,211],{"style":54},[44,545,214],{"style":67},[44,547,548],{"style":50},"readTokenFromSecretsStore",[44,550,551],{"style":54},"())",[20,553,555],{"id":554},"sign-requests-or-use-several-auth-methods","Sign requests or use several auth methods",[11,557,558,559,562,563,565],{},"Read ",[15,560,561],{},"config.security"," and pick per operation, or pass a different ",[15,564,17],{}," on a call. This works for request signing, such as AWS SigV4, and for services that use different credentials:",[35,567,569],{"language":37,"code":568,"class":39},"import { createSignedClient } from '.\u002Fclients\u002Fiam'\n\nawait getPetById({ path: { petId: 1 }, client: createSignedClient() })",[15,570,571,56,587,56,589],{"class":42},[44,572,573,575,577,580,582,584],{"class":46,"style":47},[44,574,518],{"style":67},[44,576,137],{"style":54},[44,578,579],{"style":159},"createSignedClient ",[44,581,443],{"style":54},[44,583,528],{"style":67},[44,585,586],{"style":71},"'.\u002Fclients\u002Fiam'",[44,588],{"class":46,"style":47},[44,590,591,593,596,599,602,604,606,609,611,614,616,618,620,622,625],{"class":46,"style":47},[44,592,346],{"style":67},[44,594,595],{"style":50},"getPetById",[44,597,598],{"style":54},"({ ",[44,600,601],{"style":54},"path",[44,603,68],{"style":67},[44,605,137],{"style":54},[44,607,608],{"style":54},"petId",[44,610,68],{"style":67},[44,612,613],{"style":54},"1 ",[44,615,132],{"style":54},[44,617,111],{"style":67},[44,619,17],{"style":54},[44,621,68],{"style":67},[44,623,624],{"style":50},"createSignedClient",[44,626,627],{"style":54},"() })",[11,629,630],{},"A client passed on a call replaces the default for that call only.",{"title":632,"searchDepth":633,"depth":633,"links":634},"",5,[635,638,639],{"id":22,"depth":636,"text":637},2,"The security list",{"id":176,"depth":636,"text":177},{"id":554,"depth":636,"text":555},"\u002Fextensions\u002Fkubb-labs\u002Fplugin-client\u002Fguides\u002Fauthentication",1793747914461]