[{"data":1,"prerenderedAt":1909},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-modules-auth-decorators":198,"-docs-modules-auth-decorators-surround":1904},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,109,123,134],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drivers","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":70,"body":200,"description":1898,"extension":1899,"links":1900,"meta":1901,"navigation":56,"path":71,"seo":1902,"stem":72,"__hash__":1903},"docs\u002Fdocs\u002F3.modules\u002F1.auth\u002F1.decorators.md",{"type":201,"value":202,"toc":1885},"minimark",[203,207,215,225,230,502,506,509,775,779,817,823,829,838,841,1107,1111,1117,1294,1297,1326,1330,1339,1881],[204,205,206],"p",{},"The Auth module provides decorators that integrate seamlessly with Vercube controllers, making it easy to protect endpoints and access authenticated user data.",[208,209,211],"h2",{"id":210},"auth",[212,213,214],"code",{},"@Auth",[204,216,217,218,220,221,224],{},"The ",[212,219,214],{}," decorator protects controller methods by requiring authentication before execution. It invokes the registered ",[212,222,223],{},"AuthProvider.validate()"," method to verify the request.",[226,227,229],"h3",{"id":228},"basic-usage","Basic Usage",[231,232,237],"pre",{"className":233,"code":234,"language":235,"meta":236,"style":236},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Controller, Get, Post } from '@vercube\u002Fcore';\nimport { Auth } from '@vercube\u002Fauth';\n\n@Controller('\u002Fapi')\nexport class ApiController {\n  \n  @Get('\u002Fpublic')\n  public publicEndpoint() {\n    return { message: 'Anyone can access this' };\n  }\n  \n  @Get('\u002Fprotected')\n  @Auth()\n  public protectedEndpoint() {\n    return { message: 'Only authenticated users can access this' };\n  }\n}\n","ts","",[212,238,239,286,309,315,338,355,361,381,396,420,426,431,449,459,471,491,496],{"__ignoreMap":236},[240,241,244,248,252,256,259,262,264,267,270,273,276,280,283],"span",{"class":242,"line":243},"line",1,[240,245,247],{"class":246},"s7zQu","import",[240,249,251],{"class":250},"sMK4o"," {",[240,253,255],{"class":254},"sTEyZ"," Controller",[240,257,258],{"class":250},",",[240,260,261],{"class":254}," Get",[240,263,258],{"class":250},[240,265,266],{"class":254}," Post",[240,268,269],{"class":250}," }",[240,271,272],{"class":246}," from",[240,274,275],{"class":250}," '",[240,277,279],{"class":278},"sfazB","@vercube\u002Fcore",[240,281,282],{"class":250},"'",[240,284,285],{"class":250},";\n",[240,287,289,291,293,296,298,300,302,305,307],{"class":242,"line":288},2,[240,290,247],{"class":246},[240,292,251],{"class":250},[240,294,295],{"class":254}," Auth",[240,297,269],{"class":250},[240,299,272],{"class":246},[240,301,275],{"class":250},[240,303,304],{"class":278},"@vercube\u002Fauth",[240,306,282],{"class":250},[240,308,285],{"class":250},[240,310,312],{"class":242,"line":311},3,[240,313,314],{"emptyLinePlaceholder":56},"\n",[240,316,318,321,325,328,330,333,335],{"class":242,"line":317},4,[240,319,320],{"class":250},"@",[240,322,324],{"class":323},"s2Zo4","Controller",[240,326,327],{"class":254},"(",[240,329,282],{"class":250},[240,331,332],{"class":278},"\u002Fapi",[240,334,282],{"class":250},[240,336,337],{"class":254},")\n",[240,339,341,344,348,352],{"class":242,"line":340},5,[240,342,343],{"class":246},"export",[240,345,347],{"class":346},"spNyl"," class",[240,349,351],{"class":350},"sBMFI"," ApiController",[240,353,354],{"class":250}," {\n",[240,356,358],{"class":242,"line":357},6,[240,359,360],{"class":254},"  \n",[240,362,364,367,370,372,374,377,379],{"class":242,"line":363},7,[240,365,366],{"class":250},"  @",[240,368,369],{"class":323},"Get",[240,371,327],{"class":254},[240,373,282],{"class":250},[240,375,376],{"class":278},"\u002Fpublic",[240,378,282],{"class":250},[240,380,337],{"class":254},[240,382,384,387,391,394],{"class":242,"line":383},8,[240,385,386],{"class":346},"  public",[240,388,390],{"class":389},"swJcz"," publicEndpoint",[240,392,393],{"class":250},"()",[240,395,354],{"class":250},[240,397,399,402,404,407,410,412,415,417],{"class":242,"line":398},9,[240,400,401],{"class":246},"    return",[240,403,251],{"class":250},[240,405,406],{"class":389}," message",[240,408,409],{"class":250},":",[240,411,275],{"class":250},[240,413,414],{"class":278},"Anyone can access this",[240,416,282],{"class":250},[240,418,419],{"class":250}," };\n",[240,421,423],{"class":242,"line":422},10,[240,424,425],{"class":250},"  }\n",[240,427,429],{"class":242,"line":428},11,[240,430,360],{"class":254},[240,432,434,436,438,440,442,445,447],{"class":242,"line":433},12,[240,435,366],{"class":250},[240,437,369],{"class":323},[240,439,327],{"class":254},[240,441,282],{"class":250},[240,443,444],{"class":278},"\u002Fprotected",[240,446,282],{"class":250},[240,448,337],{"class":254},[240,450,452,454,456],{"class":242,"line":451},13,[240,453,366],{"class":250},[240,455,61],{"class":323},[240,457,458],{"class":254},"()\n",[240,460,462,464,467,469],{"class":242,"line":461},14,[240,463,386],{"class":346},[240,465,466],{"class":389}," protectedEndpoint",[240,468,393],{"class":250},[240,470,354],{"class":250},[240,472,474,476,478,480,482,484,487,489],{"class":242,"line":473},15,[240,475,401],{"class":246},[240,477,251],{"class":250},[240,479,406],{"class":389},[240,481,409],{"class":250},[240,483,275],{"class":250},[240,485,486],{"class":278},"Only authenticated users can access this",[240,488,282],{"class":250},[240,490,419],{"class":250},[240,492,494],{"class":242,"line":493},16,[240,495,425],{"class":250},[240,497,499],{"class":242,"line":498},17,[240,500,501],{"class":250},"}\n",[226,503,505],{"id":504},"role-based-protection","Role-Based Protection",[204,507,508],{},"Pass options to restrict access based on user roles:",[231,510,512],{"className":233,"code":511,"language":235,"meta":236,"style":236},"import { Controller, Get, Delete } from '@vercube\u002Fcore';\nimport { Auth, User } from '@vercube\u002Fauth';\n\n@Controller('\u002Fadmin')\nexport class AdminController {\n  \n  @Get('\u002Fdashboard')\n  @Auth({ roles: ['admin'] })\n  public getDashboard() {\n    return { dashboard: 'admin data' };\n  }\n  \n  @Delete('\u002Fusers\u002F:id')\n  @Auth({ roles: ['admin', 'superadmin'] })\n  public deleteUser() {\n    \u002F\u002F Only admins and superadmins can delete users\n  }\n}\n",[212,513,514,543,568,572,589,600,604,621,655,666,686,690,694,712,749,760,766,770],{"__ignoreMap":236},[240,515,516,518,520,522,524,526,528,531,533,535,537,539,541],{"class":242,"line":243},[240,517,247],{"class":246},[240,519,251],{"class":250},[240,521,255],{"class":254},[240,523,258],{"class":250},[240,525,261],{"class":254},[240,527,258],{"class":250},[240,529,530],{"class":254}," Delete",[240,532,269],{"class":250},[240,534,272],{"class":246},[240,536,275],{"class":250},[240,538,279],{"class":278},[240,540,282],{"class":250},[240,542,285],{"class":250},[240,544,545,547,549,551,553,556,558,560,562,564,566],{"class":242,"line":288},[240,546,247],{"class":246},[240,548,251],{"class":250},[240,550,295],{"class":254},[240,552,258],{"class":250},[240,554,555],{"class":254}," User",[240,557,269],{"class":250},[240,559,272],{"class":246},[240,561,275],{"class":250},[240,563,304],{"class":278},[240,565,282],{"class":250},[240,567,285],{"class":250},[240,569,570],{"class":242,"line":311},[240,571,314],{"emptyLinePlaceholder":56},[240,573,574,576,578,580,582,585,587],{"class":242,"line":317},[240,575,320],{"class":250},[240,577,324],{"class":323},[240,579,327],{"class":254},[240,581,282],{"class":250},[240,583,584],{"class":278},"\u002Fadmin",[240,586,282],{"class":250},[240,588,337],{"class":254},[240,590,591,593,595,598],{"class":242,"line":340},[240,592,343],{"class":246},[240,594,347],{"class":346},[240,596,597],{"class":350}," AdminController",[240,599,354],{"class":250},[240,601,602],{"class":242,"line":357},[240,603,360],{"class":254},[240,605,606,608,610,612,614,617,619],{"class":242,"line":363},[240,607,366],{"class":250},[240,609,369],{"class":323},[240,611,327],{"class":254},[240,613,282],{"class":250},[240,615,616],{"class":278},"\u002Fdashboard",[240,618,282],{"class":250},[240,620,337],{"class":254},[240,622,623,625,627,629,632,635,637,640,642,645,647,650,653],{"class":242,"line":383},[240,624,366],{"class":250},[240,626,61],{"class":323},[240,628,327],{"class":254},[240,630,631],{"class":250},"{",[240,633,634],{"class":389}," roles",[240,636,409],{"class":250},[240,638,639],{"class":254}," [",[240,641,282],{"class":250},[240,643,644],{"class":278},"admin",[240,646,282],{"class":250},[240,648,649],{"class":254},"] ",[240,651,652],{"class":250},"}",[240,654,337],{"class":254},[240,656,657,659,662,664],{"class":242,"line":398},[240,658,386],{"class":346},[240,660,661],{"class":389}," getDashboard",[240,663,393],{"class":250},[240,665,354],{"class":250},[240,667,668,670,672,675,677,679,682,684],{"class":242,"line":422},[240,669,401],{"class":246},[240,671,251],{"class":250},[240,673,674],{"class":389}," dashboard",[240,676,409],{"class":250},[240,678,275],{"class":250},[240,680,681],{"class":278},"admin data",[240,683,282],{"class":250},[240,685,419],{"class":250},[240,687,688],{"class":242,"line":428},[240,689,425],{"class":250},[240,691,692],{"class":242,"line":433},[240,693,360],{"class":254},[240,695,696,698,701,703,705,708,710],{"class":242,"line":451},[240,697,366],{"class":250},[240,699,700],{"class":323},"Delete",[240,702,327],{"class":254},[240,704,282],{"class":250},[240,706,707],{"class":278},"\u002Fusers\u002F:id",[240,709,282],{"class":250},[240,711,337],{"class":254},[240,713,714,716,718,720,722,724,726,728,730,732,734,736,738,741,743,745,747],{"class":242,"line":461},[240,715,366],{"class":250},[240,717,61],{"class":323},[240,719,327],{"class":254},[240,721,631],{"class":250},[240,723,634],{"class":389},[240,725,409],{"class":250},[240,727,639],{"class":254},[240,729,282],{"class":250},[240,731,644],{"class":278},[240,733,282],{"class":250},[240,735,258],{"class":250},[240,737,275],{"class":250},[240,739,740],{"class":278},"superadmin",[240,742,282],{"class":250},[240,744,649],{"class":254},[240,746,652],{"class":250},[240,748,337],{"class":254},[240,750,751,753,756,758],{"class":242,"line":473},[240,752,386],{"class":346},[240,754,755],{"class":389}," deleteUser",[240,757,393],{"class":250},[240,759,354],{"class":250},[240,761,762],{"class":242,"line":493},[240,763,765],{"class":764},"sHwdD","    \u002F\u002F Only admins and superadmins can delete users\n",[240,767,768],{"class":242,"line":498},[240,769,425],{"class":250},[240,771,773],{"class":242,"line":772},18,[240,774,501],{"class":250},[226,776,778],{"id":777},"options","Options",[780,781,782,798],"table",{},[783,784,785],"thead",{},[786,787,788,792,795],"tr",{},[789,790,791],"th",{},"Option",[789,793,794],{},"Type",[789,796,797],{},"Description",[799,800,801],"tbody",{},[786,802,803,809,814],{},[804,805,806],"td",{},[212,807,808],{},"roles",[804,810,811],{},[212,812,813],{},"string[]",[804,815,816],{},"Array of roles allowed to access the endpoint",[204,818,819,820,822],{},"The options are passed to your ",[212,821,223],{}," method as the second parameter.",[208,824,826],{"id":825},"user",[212,827,828],{},"@User",[204,830,217,831,833,834,837],{},[212,832,828],{}," decorator injects the currently authenticated user into a controller method parameter. It calls the registered ",[212,835,836],{},"AuthProvider.getCurrentUser()"," method to retrieve the user.",[226,839,229],{"id":840},"basic-usage-1",[231,842,844],{"className":233,"code":843,"language":235,"meta":236,"style":236},"import { Controller, Get } from '@vercube\u002Fcore';\nimport { Auth, User } from '@vercube\u002Fauth';\n\ninterface User {\n  id: number;\n  username: string;\n  email: string;\n}\n\n@Controller('\u002Fprofile')\nexport class ProfileController {\n  \n  @Get('\u002F')\n  @Auth()\n  public getProfile(@User() user: User) {\n    return {\n      id: user.id,\n      username: user.username,\n      email: user.email\n    };\n  }\n}\n",[212,845,846,870,894,898,907,919,931,942,946,950,967,978,982,999,1007,1035,1041,1060,1076,1091,1097,1102],{"__ignoreMap":236},[240,847,848,850,852,854,856,858,860,862,864,866,868],{"class":242,"line":243},[240,849,247],{"class":246},[240,851,251],{"class":250},[240,853,255],{"class":254},[240,855,258],{"class":250},[240,857,261],{"class":254},[240,859,269],{"class":250},[240,861,272],{"class":246},[240,863,275],{"class":250},[240,865,279],{"class":278},[240,867,282],{"class":250},[240,869,285],{"class":250},[240,871,872,874,876,878,880,882,884,886,888,890,892],{"class":242,"line":288},[240,873,247],{"class":246},[240,875,251],{"class":250},[240,877,295],{"class":254},[240,879,258],{"class":250},[240,881,555],{"class":254},[240,883,269],{"class":250},[240,885,272],{"class":246},[240,887,275],{"class":250},[240,889,304],{"class":278},[240,891,282],{"class":250},[240,893,285],{"class":250},[240,895,896],{"class":242,"line":311},[240,897,314],{"emptyLinePlaceholder":56},[240,899,900,903,905],{"class":242,"line":317},[240,901,902],{"class":346},"interface",[240,904,555],{"class":350},[240,906,354],{"class":250},[240,908,909,912,914,917],{"class":242,"line":340},[240,910,911],{"class":389},"  id",[240,913,409],{"class":250},[240,915,916],{"class":350}," number",[240,918,285],{"class":250},[240,920,921,924,926,929],{"class":242,"line":357},[240,922,923],{"class":389},"  username",[240,925,409],{"class":250},[240,927,928],{"class":350}," string",[240,930,285],{"class":250},[240,932,933,936,938,940],{"class":242,"line":363},[240,934,935],{"class":389},"  email",[240,937,409],{"class":250},[240,939,928],{"class":350},[240,941,285],{"class":250},[240,943,944],{"class":242,"line":383},[240,945,501],{"class":250},[240,947,948],{"class":242,"line":398},[240,949,314],{"emptyLinePlaceholder":56},[240,951,952,954,956,958,960,963,965],{"class":242,"line":422},[240,953,320],{"class":250},[240,955,324],{"class":323},[240,957,327],{"class":254},[240,959,282],{"class":250},[240,961,962],{"class":278},"\u002Fprofile",[240,964,282],{"class":250},[240,966,337],{"class":254},[240,968,969,971,973,976],{"class":242,"line":428},[240,970,343],{"class":246},[240,972,347],{"class":346},[240,974,975],{"class":350}," ProfileController",[240,977,354],{"class":250},[240,979,980],{"class":242,"line":433},[240,981,360],{"class":254},[240,983,984,986,988,990,992,995,997],{"class":242,"line":451},[240,985,366],{"class":250},[240,987,369],{"class":323},[240,989,327],{"class":254},[240,991,282],{"class":250},[240,993,994],{"class":278},"\u002F",[240,996,282],{"class":250},[240,998,337],{"class":254},[240,1000,1001,1003,1005],{"class":242,"line":461},[240,1002,366],{"class":250},[240,1004,61],{"class":323},[240,1006,458],{"class":254},[240,1008,1009,1011,1014,1017,1020,1023,1026,1028,1030,1033],{"class":242,"line":473},[240,1010,386],{"class":346},[240,1012,1013],{"class":389}," getProfile",[240,1015,1016],{"class":250},"(@",[240,1018,1019],{"class":323},"User",[240,1021,1022],{"class":254},"() ",[240,1024,825],{"class":1025},"sHdIc",[240,1027,409],{"class":250},[240,1029,555],{"class":350},[240,1031,1032],{"class":250},")",[240,1034,354],{"class":250},[240,1036,1037,1039],{"class":242,"line":493},[240,1038,401],{"class":246},[240,1040,354],{"class":250},[240,1042,1043,1046,1048,1051,1054,1057],{"class":242,"line":498},[240,1044,1045],{"class":389},"      id",[240,1047,409],{"class":250},[240,1049,1050],{"class":254}," user",[240,1052,1053],{"class":250},".",[240,1055,1056],{"class":254},"id",[240,1058,1059],{"class":250},",\n",[240,1061,1062,1065,1067,1069,1071,1074],{"class":242,"line":772},[240,1063,1064],{"class":389},"      username",[240,1066,409],{"class":250},[240,1068,1050],{"class":254},[240,1070,1053],{"class":250},[240,1072,1073],{"class":254},"username",[240,1075,1059],{"class":250},[240,1077,1079,1082,1084,1086,1088],{"class":242,"line":1078},19,[240,1080,1081],{"class":389},"      email",[240,1083,409],{"class":250},[240,1085,1050],{"class":254},[240,1087,1053],{"class":250},[240,1089,1090],{"class":254},"email\n",[240,1092,1094],{"class":242,"line":1093},20,[240,1095,1096],{"class":250},"    };\n",[240,1098,1100],{"class":242,"line":1099},21,[240,1101,425],{"class":250},[240,1103,1105],{"class":242,"line":1104},22,[240,1106,501],{"class":250},[226,1108,1110],{"id":1109},"custom-auth-provider","Custom Auth Provider",[204,1112,1113,1114,1116],{},"You can specify a custom auth provider for the ",[212,1115,828],{}," decorator:",[231,1118,1120],{"className":233,"code":1119,"language":235,"meta":236,"style":236},"import { Controller, Get } from '@vercube\u002Fcore';\nimport { User } from '@vercube\u002Fauth';\nimport { CustomAuthProvider } from '..\u002Fproviders\u002FCustomAuthProvider';\n\n@Controller('\u002Fapi')\nexport class ApiController {\n  \n  @Get('\u002Fme')\n  public getMe(@User({ provider: CustomAuthProvider }) user: CustomUser) {\n    return user;\n  }\n}\n",[212,1121,1122,1146,1166,1188,1192,1208,1218,1222,1239,1278,1286,1290],{"__ignoreMap":236},[240,1123,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144],{"class":242,"line":243},[240,1125,247],{"class":246},[240,1127,251],{"class":250},[240,1129,255],{"class":254},[240,1131,258],{"class":250},[240,1133,261],{"class":254},[240,1135,269],{"class":250},[240,1137,272],{"class":246},[240,1139,275],{"class":250},[240,1141,279],{"class":278},[240,1143,282],{"class":250},[240,1145,285],{"class":250},[240,1147,1148,1150,1152,1154,1156,1158,1160,1162,1164],{"class":242,"line":288},[240,1149,247],{"class":246},[240,1151,251],{"class":250},[240,1153,555],{"class":254},[240,1155,269],{"class":250},[240,1157,272],{"class":246},[240,1159,275],{"class":250},[240,1161,304],{"class":278},[240,1163,282],{"class":250},[240,1165,285],{"class":250},[240,1167,1168,1170,1172,1175,1177,1179,1181,1184,1186],{"class":242,"line":311},[240,1169,247],{"class":246},[240,1171,251],{"class":250},[240,1173,1174],{"class":254}," CustomAuthProvider",[240,1176,269],{"class":250},[240,1178,272],{"class":246},[240,1180,275],{"class":250},[240,1182,1183],{"class":278},"..\u002Fproviders\u002FCustomAuthProvider",[240,1185,282],{"class":250},[240,1187,285],{"class":250},[240,1189,1190],{"class":242,"line":317},[240,1191,314],{"emptyLinePlaceholder":56},[240,1193,1194,1196,1198,1200,1202,1204,1206],{"class":242,"line":340},[240,1195,320],{"class":250},[240,1197,324],{"class":323},[240,1199,327],{"class":254},[240,1201,282],{"class":250},[240,1203,332],{"class":278},[240,1205,282],{"class":250},[240,1207,337],{"class":254},[240,1209,1210,1212,1214,1216],{"class":242,"line":357},[240,1211,343],{"class":246},[240,1213,347],{"class":346},[240,1215,351],{"class":350},[240,1217,354],{"class":250},[240,1219,1220],{"class":242,"line":363},[240,1221,360],{"class":254},[240,1223,1224,1226,1228,1230,1232,1235,1237],{"class":242,"line":383},[240,1225,366],{"class":250},[240,1227,369],{"class":323},[240,1229,327],{"class":254},[240,1231,282],{"class":250},[240,1233,1234],{"class":278},"\u002Fme",[240,1236,282],{"class":250},[240,1238,337],{"class":254},[240,1240,1241,1243,1246,1248,1250,1252,1254,1257,1259,1262,1264,1267,1269,1271,1274,1276],{"class":242,"line":398},[240,1242,386],{"class":346},[240,1244,1245],{"class":389}," getMe",[240,1247,1016],{"class":250},[240,1249,1019],{"class":323},[240,1251,327],{"class":254},[240,1253,631],{"class":250},[240,1255,1256],{"class":389}," provider",[240,1258,409],{"class":250},[240,1260,1261],{"class":254}," CustomAuthProvider ",[240,1263,652],{"class":250},[240,1265,1266],{"class":254},") ",[240,1268,825],{"class":1025},[240,1270,409],{"class":250},[240,1272,1273],{"class":350}," CustomUser",[240,1275,1032],{"class":250},[240,1277,354],{"class":250},[240,1279,1280,1282,1284],{"class":242,"line":422},[240,1281,401],{"class":246},[240,1283,1050],{"class":254},[240,1285,285],{"class":250},[240,1287,1288],{"class":242,"line":428},[240,1289,425],{"class":250},[240,1291,1292],{"class":242,"line":433},[240,1293,501],{"class":250},[226,1295,778],{"id":1296},"options-1",[780,1298,1299,1309],{},[783,1300,1301],{},[786,1302,1303,1305,1307],{},[789,1304,791],{},[789,1306,794],{},[789,1308,797],{},[799,1310,1311],{},[786,1312,1313,1318,1323],{},[804,1314,1315],{},[212,1316,1317],{},"provider",[804,1319,1320],{},[212,1321,1322],{},"typeof AuthProvider",[804,1324,1325],{},"Custom auth provider class to use",[208,1327,1329],{"id":1328},"combining-decorators","Combining Decorators",[204,1331,1332,1333,1335,1336,1338],{},"Use ",[212,1334,214],{}," and ",[212,1337,828],{}," together to protect endpoints and access user data:",[231,1340,1342],{"className":233,"code":1341,"language":235,"meta":236,"style":236},"import { Controller, Get, Post, Put } from '@vercube\u002Fcore';\nimport { Auth, User } from '@vercube\u002Fauth';\n\ninterface User {\n  id: number;\n  username: string;\n  roles: string[];\n}\n\n@Controller('\u002Fusers')\nexport class UserController {\n  \n  @Get('\u002Fme')\n  @Auth()\n  public getCurrentUser(@User() user: User) {\n    return user;\n  }\n  \n  @Put('\u002Fme')\n  @Auth()\n  public updateProfile(@User() user: User) {\n    \u002F\u002F Update user profile\n    return { updated: true, userId: user.id };\n  }\n  \n  @Get('\u002Fall')\n  @Auth({ roles: ['admin'] })\n  public getAllUsers(@User() admin: User) {\n    \u002F\u002F Admin can view all users\n    return { requestedBy: admin.username, users: [] };\n  }\n  \n  @Post('\u002Fban\u002F:id')\n  @Auth({ roles: ['admin', 'moderator'] })\n  public banUser(@User() moderator: User) {\n    \u002F\u002F Admins and moderators can ban users\n    return { bannedBy: moderator.username };\n  }\n}\n",[212,1343,1344,1377,1401,1405,1413,1423,1433,1447,1451,1455,1472,1483,1487,1503,1511,1534,1542,1546,1550,1567,1575,1598,1603,1634,1639,1644,1662,1691,1715,1721,1753,1758,1763,1782,1820,1844,1850,1871,1876],{"__ignoreMap":236},[240,1345,1346,1348,1350,1352,1354,1356,1358,1360,1362,1365,1367,1369,1371,1373,1375],{"class":242,"line":243},[240,1347,247],{"class":246},[240,1349,251],{"class":250},[240,1351,255],{"class":254},[240,1353,258],{"class":250},[240,1355,261],{"class":254},[240,1357,258],{"class":250},[240,1359,266],{"class":254},[240,1361,258],{"class":250},[240,1363,1364],{"class":254}," Put",[240,1366,269],{"class":250},[240,1368,272],{"class":246},[240,1370,275],{"class":250},[240,1372,279],{"class":278},[240,1374,282],{"class":250},[240,1376,285],{"class":250},[240,1378,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399],{"class":242,"line":288},[240,1380,247],{"class":246},[240,1382,251],{"class":250},[240,1384,295],{"class":254},[240,1386,258],{"class":250},[240,1388,555],{"class":254},[240,1390,269],{"class":250},[240,1392,272],{"class":246},[240,1394,275],{"class":250},[240,1396,304],{"class":278},[240,1398,282],{"class":250},[240,1400,285],{"class":250},[240,1402,1403],{"class":242,"line":311},[240,1404,314],{"emptyLinePlaceholder":56},[240,1406,1407,1409,1411],{"class":242,"line":317},[240,1408,902],{"class":346},[240,1410,555],{"class":350},[240,1412,354],{"class":250},[240,1414,1415,1417,1419,1421],{"class":242,"line":340},[240,1416,911],{"class":389},[240,1418,409],{"class":250},[240,1420,916],{"class":350},[240,1422,285],{"class":250},[240,1424,1425,1427,1429,1431],{"class":242,"line":357},[240,1426,923],{"class":389},[240,1428,409],{"class":250},[240,1430,928],{"class":350},[240,1432,285],{"class":250},[240,1434,1435,1438,1440,1442,1445],{"class":242,"line":363},[240,1436,1437],{"class":389},"  roles",[240,1439,409],{"class":250},[240,1441,928],{"class":350},[240,1443,1444],{"class":254},"[]",[240,1446,285],{"class":250},[240,1448,1449],{"class":242,"line":383},[240,1450,501],{"class":250},[240,1452,1453],{"class":242,"line":398},[240,1454,314],{"emptyLinePlaceholder":56},[240,1456,1457,1459,1461,1463,1465,1468,1470],{"class":242,"line":422},[240,1458,320],{"class":250},[240,1460,324],{"class":323},[240,1462,327],{"class":254},[240,1464,282],{"class":250},[240,1466,1467],{"class":278},"\u002Fusers",[240,1469,282],{"class":250},[240,1471,337],{"class":254},[240,1473,1474,1476,1478,1481],{"class":242,"line":428},[240,1475,343],{"class":246},[240,1477,347],{"class":346},[240,1479,1480],{"class":350}," UserController",[240,1482,354],{"class":250},[240,1484,1485],{"class":242,"line":433},[240,1486,360],{"class":254},[240,1488,1489,1491,1493,1495,1497,1499,1501],{"class":242,"line":451},[240,1490,366],{"class":250},[240,1492,369],{"class":323},[240,1494,327],{"class":254},[240,1496,282],{"class":250},[240,1498,1234],{"class":278},[240,1500,282],{"class":250},[240,1502,337],{"class":254},[240,1504,1505,1507,1509],{"class":242,"line":461},[240,1506,366],{"class":250},[240,1508,61],{"class":323},[240,1510,458],{"class":254},[240,1512,1513,1515,1518,1520,1522,1524,1526,1528,1530,1532],{"class":242,"line":473},[240,1514,386],{"class":346},[240,1516,1517],{"class":389}," getCurrentUser",[240,1519,1016],{"class":250},[240,1521,1019],{"class":323},[240,1523,1022],{"class":254},[240,1525,825],{"class":1025},[240,1527,409],{"class":250},[240,1529,555],{"class":350},[240,1531,1032],{"class":250},[240,1533,354],{"class":250},[240,1535,1536,1538,1540],{"class":242,"line":493},[240,1537,401],{"class":246},[240,1539,1050],{"class":254},[240,1541,285],{"class":250},[240,1543,1544],{"class":242,"line":498},[240,1545,425],{"class":250},[240,1547,1548],{"class":242,"line":772},[240,1549,360],{"class":254},[240,1551,1552,1554,1557,1559,1561,1563,1565],{"class":242,"line":1078},[240,1553,366],{"class":250},[240,1555,1556],{"class":323},"Put",[240,1558,327],{"class":254},[240,1560,282],{"class":250},[240,1562,1234],{"class":278},[240,1564,282],{"class":250},[240,1566,337],{"class":254},[240,1568,1569,1571,1573],{"class":242,"line":1093},[240,1570,366],{"class":250},[240,1572,61],{"class":323},[240,1574,458],{"class":254},[240,1576,1577,1579,1582,1584,1586,1588,1590,1592,1594,1596],{"class":242,"line":1099},[240,1578,386],{"class":346},[240,1580,1581],{"class":389}," updateProfile",[240,1583,1016],{"class":250},[240,1585,1019],{"class":323},[240,1587,1022],{"class":254},[240,1589,825],{"class":1025},[240,1591,409],{"class":250},[240,1593,555],{"class":350},[240,1595,1032],{"class":250},[240,1597,354],{"class":250},[240,1599,1600],{"class":242,"line":1104},[240,1601,1602],{"class":764},"    \u002F\u002F Update user profile\n",[240,1604,1606,1608,1610,1613,1615,1619,1621,1624,1626,1628,1630,1632],{"class":242,"line":1605},23,[240,1607,401],{"class":246},[240,1609,251],{"class":250},[240,1611,1612],{"class":389}," updated",[240,1614,409],{"class":250},[240,1616,1618],{"class":1617},"sfNiH"," true",[240,1620,258],{"class":250},[240,1622,1623],{"class":389}," userId",[240,1625,409],{"class":250},[240,1627,1050],{"class":254},[240,1629,1053],{"class":250},[240,1631,1056],{"class":254},[240,1633,419],{"class":250},[240,1635,1637],{"class":242,"line":1636},24,[240,1638,425],{"class":250},[240,1640,1642],{"class":242,"line":1641},25,[240,1643,360],{"class":254},[240,1645,1647,1649,1651,1653,1655,1658,1660],{"class":242,"line":1646},26,[240,1648,366],{"class":250},[240,1650,369],{"class":323},[240,1652,327],{"class":254},[240,1654,282],{"class":250},[240,1656,1657],{"class":278},"\u002Fall",[240,1659,282],{"class":250},[240,1661,337],{"class":254},[240,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689],{"class":242,"line":1664},27,[240,1666,366],{"class":250},[240,1668,61],{"class":323},[240,1670,327],{"class":254},[240,1672,631],{"class":250},[240,1674,634],{"class":389},[240,1676,409],{"class":250},[240,1678,639],{"class":254},[240,1680,282],{"class":250},[240,1682,644],{"class":278},[240,1684,282],{"class":250},[240,1686,649],{"class":254},[240,1688,652],{"class":250},[240,1690,337],{"class":254},[240,1692,1694,1696,1699,1701,1703,1705,1707,1709,1711,1713],{"class":242,"line":1693},28,[240,1695,386],{"class":346},[240,1697,1698],{"class":389}," getAllUsers",[240,1700,1016],{"class":250},[240,1702,1019],{"class":323},[240,1704,1022],{"class":254},[240,1706,644],{"class":1025},[240,1708,409],{"class":250},[240,1710,555],{"class":350},[240,1712,1032],{"class":250},[240,1714,354],{"class":250},[240,1716,1718],{"class":242,"line":1717},29,[240,1719,1720],{"class":764},"    \u002F\u002F Admin can view all users\n",[240,1722,1724,1726,1728,1731,1733,1736,1738,1740,1742,1745,1747,1750],{"class":242,"line":1723},30,[240,1725,401],{"class":246},[240,1727,251],{"class":250},[240,1729,1730],{"class":389}," requestedBy",[240,1732,409],{"class":250},[240,1734,1735],{"class":254}," admin",[240,1737,1053],{"class":250},[240,1739,1073],{"class":254},[240,1741,258],{"class":250},[240,1743,1744],{"class":389}," users",[240,1746,409],{"class":250},[240,1748,1749],{"class":389}," [] ",[240,1751,1752],{"class":250},"};\n",[240,1754,1756],{"class":242,"line":1755},31,[240,1757,425],{"class":250},[240,1759,1761],{"class":242,"line":1760},32,[240,1762,360],{"class":254},[240,1764,1766,1768,1771,1773,1775,1778,1780],{"class":242,"line":1765},33,[240,1767,366],{"class":250},[240,1769,1770],{"class":323},"Post",[240,1772,327],{"class":254},[240,1774,282],{"class":250},[240,1776,1777],{"class":278},"\u002Fban\u002F:id",[240,1779,282],{"class":250},[240,1781,337],{"class":254},[240,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1812,1814,1816,1818],{"class":242,"line":1784},34,[240,1786,366],{"class":250},[240,1788,61],{"class":323},[240,1790,327],{"class":254},[240,1792,631],{"class":250},[240,1794,634],{"class":389},[240,1796,409],{"class":250},[240,1798,639],{"class":254},[240,1800,282],{"class":250},[240,1802,644],{"class":278},[240,1804,282],{"class":250},[240,1806,258],{"class":250},[240,1808,275],{"class":250},[240,1810,1811],{"class":278},"moderator",[240,1813,282],{"class":250},[240,1815,649],{"class":254},[240,1817,652],{"class":250},[240,1819,337],{"class":254},[240,1821,1823,1825,1828,1830,1832,1834,1836,1838,1840,1842],{"class":242,"line":1822},35,[240,1824,386],{"class":346},[240,1826,1827],{"class":389}," banUser",[240,1829,1016],{"class":250},[240,1831,1019],{"class":323},[240,1833,1022],{"class":254},[240,1835,1811],{"class":1025},[240,1837,409],{"class":250},[240,1839,555],{"class":350},[240,1841,1032],{"class":250},[240,1843,354],{"class":250},[240,1845,1847],{"class":242,"line":1846},36,[240,1848,1849],{"class":764},"    \u002F\u002F Admins and moderators can ban users\n",[240,1851,1853,1855,1857,1860,1862,1865,1867,1869],{"class":242,"line":1852},37,[240,1854,401],{"class":246},[240,1856,251],{"class":250},[240,1858,1859],{"class":389}," bannedBy",[240,1861,409],{"class":250},[240,1863,1864],{"class":254}," moderator",[240,1866,1053],{"class":250},[240,1868,1073],{"class":254},[240,1870,419],{"class":250},[240,1872,1874],{"class":242,"line":1873},38,[240,1875,425],{"class":250},[240,1877,1879],{"class":242,"line":1878},39,[240,1880,501],{"class":250},[1882,1883,1884],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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);}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 .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 pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":236,"searchDepth":243,"depth":288,"links":1886},[1887,1892,1897],{"id":210,"depth":288,"text":214,"children":1888},[1889,1890,1891],{"id":228,"depth":311,"text":229},{"id":504,"depth":311,"text":505},{"id":777,"depth":311,"text":778},{"id":825,"depth":288,"text":828,"children":1893},[1894,1895,1896],{"id":840,"depth":311,"text":229},{"id":1109,"depth":311,"text":1110},{"id":1296,"depth":311,"text":778},{"id":1328,"depth":288,"text":1329},"Authentication decorators for protecting endpoints and accessing user data","md",null,{},{"title":70,"description":1898},"Apwig1n6QP75Y8Ndtfn34V4svCm4i-zsmGOBgJ9ao8I",[1905,1907],{"title":66,"path":67,"stem":68,"description":1906,"children":-1},"Flexible authentication system for Vercube applications",{"title":74,"path":75,"stem":76,"description":1908,"children":-1},"Complete API reference for the Vercube Auth module",1775552782493]