[{"data":1,"prerenderedAt":3401},["ShallowReactive",2],{"post-nestjs-auth0-user-registration":3},{"id":4,"title":5,"body":6,"date":3389,"description":3390,"extension":3391,"meta":3392,"navigation":340,"path":3397,"seo":3398,"stem":3399,"__hash__":3400},"blog\u002Fblog\u002Fnestjs-auth0-user-registration.md","NestJSでAuth0 Management APIを使ったユーザー登録",{"type":7,"value":8,"toc":3358},"minimark",[9,14,18,24,40,43,48,88,92,99,122,126,129,155,159,162,246,284,288,293,386,390,1439,1443,1447,1919,1923,2039,2056,2060,2064,2235,2239,2484,2488,2579,2582,2586,2589,2600,2604,2723,2727,2815,2819,2822,2935,2938,3285,3288,3291,3323,3326,3329,3354],[10,11,13],"h2",{"id":12},"auth0-management-apiとは","Auth0 Management APIとは",[15,16,17],"p",{},"Auth0 Management APIは、Auth0のリソース（ユーザー、アプリケーション、接続など）をプログラムから操作するためのREST APIです。",[15,19,20],{},[21,22,23],"strong",{},"主な用途",[25,26,27,31,34,37],"ul",{},[28,29,30],"li",{},"ユーザーの作成・更新・削除",[28,32,33],{},"ロールやパーミッションの管理",[28,35,36],{},"ログの取得と分析",[28,38,39],{},"アプリケーション設定の管理",[10,41,42],{"id":42},"事前準備",[44,45,47],"h3",{"id":46},"_1-パッケージのインストール","1. パッケージのインストール",[49,50,55],"pre",{"className":51,"code":52,"language":53,"meta":54,"style":54},"language-bash shiki shiki-themes github-light github-dark","npm install auth0\nnpm install -D @types\u002Fauth0\n","bash","",[56,57,58,74],"code",{"__ignoreMap":54},[59,60,63,67,71],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"sScJk","npm",[59,68,70],{"class":69},"sZZnC"," install",[59,72,73],{"class":69}," auth0\n",[59,75,77,79,81,85],{"class":61,"line":76},2,[59,78,66],{"class":65},[59,80,70],{"class":69},[59,82,84],{"class":83},"sj4cs"," -D",[59,86,87],{"class":69}," @types\u002Fauth0\n",[44,89,91],{"id":90},"_2-auth0でアプリケーションを作成","2. Auth0でアプリケーションを作成",[15,93,94,95,98],{},"Auth0ダッシュボードで",[21,96,97],{},"Machine to Machine Application","を作成し、以下の情報を取得します",[25,100,101,110,116],{},[28,102,103,106,107],{},[21,104,105],{},"Domain",": ",[56,108,109],{},"your-tenant.auth0.com",[28,111,112,115],{},[21,113,114],{},"Client ID",": アプリケーションID",[28,117,118,121],{},[21,119,120],{},"Client Secret",": シークレットキー",[44,123,125],{"id":124},"_3-必要なスコープを付与","3. 必要なスコープを付与",[15,127,128],{},"Management APIに対して以下のスコープを付与します",[25,130,131,137,143,149],{},[28,132,133,136],{},[56,134,135],{},"create:users",": ユーザーの作成",[28,138,139,142],{},[56,140,141],{},"read:users",": ユーザー情報の取得",[28,144,145,148],{},[56,146,147],{},"update:users",": ユーザー情報の更新",[28,150,151,154],{},[56,152,153],{},"delete:users",": ユーザーの削除（必要に応じて）",[10,156,158],{"id":157},"nestjsでの実装","NestJSでの実装",[44,160,161],{"id":161},"環境変数の設定",[49,163,167],{"className":164,"code":165,"language":166,"meta":54,"style":54},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F config\u002Fconfiguration.ts\nexport default () => ({\n  auth0: {\n    domain: process.env.AUTH0_DOMAIN,\n    clientId: process.env.AUTH0_CLIENT_ID,\n    clientSecret: process.env.AUTH0_CLIENT_SECRET,\n  },\n})\n","typescript",[56,168,169,175,194,200,212,223,234,240],{"__ignoreMap":54},[59,170,171],{"class":61,"line":62},[59,172,174],{"class":173},"sJ8bj","\u002F\u002F config\u002Fconfiguration.ts\n",[59,176,177,181,184,188,191],{"class":61,"line":76},[59,178,180],{"class":179},"szBVR","export",[59,182,183],{"class":179}," default",[59,185,187],{"class":186},"sVt8B"," () ",[59,189,190],{"class":179},"=>",[59,192,193],{"class":186}," ({\n",[59,195,197],{"class":61,"line":196},3,[59,198,199],{"class":186},"  auth0: {\n",[59,201,203,206,209],{"class":61,"line":202},4,[59,204,205],{"class":186},"    domain: process.env.",[59,207,208],{"class":83},"AUTH0_DOMAIN",[59,210,211],{"class":186},",\n",[59,213,215,218,221],{"class":61,"line":214},5,[59,216,217],{"class":186},"    clientId: process.env.",[59,219,220],{"class":83},"AUTH0_CLIENT_ID",[59,222,211],{"class":186},[59,224,226,229,232],{"class":61,"line":225},6,[59,227,228],{"class":186},"    clientSecret: process.env.",[59,230,231],{"class":83},"AUTH0_CLIENT_SECRET",[59,233,211],{"class":186},[59,235,237],{"class":61,"line":236},7,[59,238,239],{"class":186},"  },\n",[59,241,243],{"class":61,"line":242},8,[59,244,245],{"class":186},"})\n",[49,247,249],{"className":51,"code":248,"language":53,"meta":54,"style":54},"# .env\nAUTH0_DOMAIN=your-tenant.auth0.com\nAUTH0_CLIENT_ID=your_client_id\nAUTH0_CLIENT_SECRET=your_client_secret\n",[56,250,251,256,266,275],{"__ignoreMap":54},[59,252,253],{"class":61,"line":62},[59,254,255],{"class":173},"# .env\n",[59,257,258,260,263],{"class":61,"line":76},[59,259,208],{"class":186},[59,261,262],{"class":179},"=",[59,264,265],{"class":69},"your-tenant.auth0.com\n",[59,267,268,270,272],{"class":61,"line":196},[59,269,220],{"class":186},[59,271,262],{"class":179},[59,273,274],{"class":69},"your_client_id\n",[59,276,277,279,281],{"class":61,"line":202},[59,278,231],{"class":186},[59,280,262],{"class":179},[59,282,283],{"class":69},"your_client_secret\n",[44,285,287],{"id":286},"auth0モジュールの実装","Auth0モジュールの実装",[289,290,292],"h4",{"id":291},"module","Module",[49,294,296],{"className":164,"code":295,"language":166,"meta":54,"style":54},"import { Module } from '@nestjs\u002Fcommon'\nimport { ConfigModule } from '@nestjs\u002Fconfig'\nimport { Auth0Service } from '.\u002Fauth0.service'\n\n@Module({\n  imports: [ConfigModule],\n  providers: [Auth0Service],\n  exports: [Auth0Service],\n})\nexport class Auth0Module {}\n",[56,297,298,312,324,336,342,352,357,362,367,372],{"__ignoreMap":54},[59,299,300,303,306,309],{"class":61,"line":62},[59,301,302],{"class":179},"import",[59,304,305],{"class":186}," { Module } ",[59,307,308],{"class":179},"from",[59,310,311],{"class":69}," '@nestjs\u002Fcommon'\n",[59,313,314,316,319,321],{"class":61,"line":76},[59,315,302],{"class":179},[59,317,318],{"class":186}," { ConfigModule } ",[59,320,308],{"class":179},[59,322,323],{"class":69}," '@nestjs\u002Fconfig'\n",[59,325,326,328,331,333],{"class":61,"line":196},[59,327,302],{"class":179},[59,329,330],{"class":186}," { Auth0Service } ",[59,332,308],{"class":179},[59,334,335],{"class":69}," '.\u002Fauth0.service'\n",[59,337,338],{"class":61,"line":202},[59,339,341],{"emptyLinePlaceholder":340},true,"\n",[59,343,344,347,349],{"class":61,"line":214},[59,345,346],{"class":186},"@",[59,348,292],{"class":65},[59,350,351],{"class":186},"({\n",[59,353,354],{"class":61,"line":225},[59,355,356],{"class":186},"  imports: [ConfigModule],\n",[59,358,359],{"class":61,"line":236},[59,360,361],{"class":186},"  providers: [Auth0Service],\n",[59,363,364],{"class":61,"line":242},[59,365,366],{"class":186},"  exports: [Auth0Service],\n",[59,368,370],{"class":61,"line":369},9,[59,371,245],{"class":186},[59,373,375,377,380,383],{"class":61,"line":374},10,[59,376,180],{"class":179},[59,378,379],{"class":179}," class",[59,381,382],{"class":65}," Auth0Module",[59,384,385],{"class":186}," {}\n",[289,387,389],{"id":388},"service","Service",[49,391,393],{"className":164,"code":392,"language":166,"meta":54,"style":54},"import { Injectable, InternalServerErrorException } from '@nestjs\u002Fcommon'\nimport { ConfigService } from '@nestjs\u002Fconfig'\nimport { ManagementClient, User } from 'auth0'\n\nexport interface CreateUserInput {\n  email: string\n  password: string\n  name?: string\n}\n\nexport interface CreateUserOutput {\n  userId: string\n  email: string\n}\n\n@Injectable()\nexport class Auth0Service {\n  private readonly client: ManagementClient\n  private readonly connection = 'Username-Password-Authentication'\n\n  constructor(private configService: ConfigService) {\n    this.client = new ManagementClient({\n      domain: this.configService.get\u003Cstring>('auth0.domain')!,\n      clientId: this.configService.get\u003Cstring>('auth0.clientId')!,\n      clientSecret: this.configService.get\u003Cstring>('auth0.clientSecret')!,\n      scope: 'create:users read:users update:users',\n    })\n  }\n\n  async createUser(input: CreateUserInput): Promise\u003CCreateUserOutput> {\n    try {\n      const user = await this.client.createUser({\n        connection: this.connection,\n        email: input.email,\n        password: input.password,\n        name: input.name,\n        email_verified: false,\n      })\n\n      if (!user.user_id) {\n        throw new Error('User ID not returned from Auth0')\n      }\n\n      return {\n        userId: user.user_id,\n        email: user.email!,\n      }\n    } catch (error) {\n      this.handleAuth0Error(error)\n    }\n  }\n\n  async getUserById(userId: string): Promise\u003CUser> {\n    try {\n      return await this.client.getUser({ id: userId })\n    } catch (error) {\n      this.handleAuth0Error(error)\n    }\n  }\n\n  async updateUser(userId: string, data: Partial\u003CUser>): Promise\u003CUser> {\n    try {\n      return await this.client.updateUser({ id: userId }, data)\n    } catch (error) {\n      this.handleAuth0Error(error)\n    }\n  }\n\n  async deleteUser(userId: string): Promise\u003Cvoid> {\n    try {\n      await this.client.deleteUser({ id: userId })\n    } catch (error) {\n      this.handleAuth0Error(error)\n    }\n  }\n\n  private handleAuth0Error(error: any): never {\n    if (error.statusCode === 409) {\n      throw new InternalServerErrorException('User already exists')\n    }\n\n    if (error.statusCode === 400) {\n      throw new InternalServerErrorException(\n        `Invalid input: ${error.message}`,\n      )\n    }\n\n    throw new InternalServerErrorException(\n      `Auth0 error: ${error.message || 'Unknown error'}`,\n    )\n  }\n}\n",[56,394,395,406,417,429,433,446,458,467,477,482,486,498,508,517,522,527,538,550,567,583,588,611,630,665,692,719,730,736,742,747,780,788,813,824,830,836,842,853,859,864,878,897,903,908,916,922,932,937,949,964,970,975,980,1011,1018,1035,1044,1055,1060,1065,1070,1114,1121,1138,1147,1158,1163,1168,1173,1202,1209,1224,1233,1244,1249,1254,1259,1286,1303,1321,1326,1331,1345,1357,1375,1381,1386,1391,1403,1423,1429,1434],{"__ignoreMap":54},[59,396,397,399,402,404],{"class":61,"line":62},[59,398,302],{"class":179},[59,400,401],{"class":186}," { Injectable, InternalServerErrorException } ",[59,403,308],{"class":179},[59,405,311],{"class":69},[59,407,408,410,413,415],{"class":61,"line":76},[59,409,302],{"class":179},[59,411,412],{"class":186}," { ConfigService } ",[59,414,308],{"class":179},[59,416,323],{"class":69},[59,418,419,421,424,426],{"class":61,"line":196},[59,420,302],{"class":179},[59,422,423],{"class":186}," { ManagementClient, User } ",[59,425,308],{"class":179},[59,427,428],{"class":69}," 'auth0'\n",[59,430,431],{"class":61,"line":202},[59,432,341],{"emptyLinePlaceholder":340},[59,434,435,437,440,443],{"class":61,"line":214},[59,436,180],{"class":179},[59,438,439],{"class":179}," interface",[59,441,442],{"class":65}," CreateUserInput",[59,444,445],{"class":186}," {\n",[59,447,448,452,455],{"class":61,"line":225},[59,449,451],{"class":450},"s4XuR","  email",[59,453,454],{"class":179},":",[59,456,457],{"class":83}," string\n",[59,459,460,463,465],{"class":61,"line":236},[59,461,462],{"class":450},"  password",[59,464,454],{"class":179},[59,466,457],{"class":83},[59,468,469,472,475],{"class":61,"line":242},[59,470,471],{"class":450},"  name",[59,473,474],{"class":179},"?:",[59,476,457],{"class":83},[59,478,479],{"class":61,"line":369},[59,480,481],{"class":186},"}\n",[59,483,484],{"class":61,"line":374},[59,485,341],{"emptyLinePlaceholder":340},[59,487,489,491,493,496],{"class":61,"line":488},11,[59,490,180],{"class":179},[59,492,439],{"class":179},[59,494,495],{"class":65}," CreateUserOutput",[59,497,445],{"class":186},[59,499,501,504,506],{"class":61,"line":500},12,[59,502,503],{"class":450},"  userId",[59,505,454],{"class":179},[59,507,457],{"class":83},[59,509,511,513,515],{"class":61,"line":510},13,[59,512,451],{"class":450},[59,514,454],{"class":179},[59,516,457],{"class":83},[59,518,520],{"class":61,"line":519},14,[59,521,481],{"class":186},[59,523,525],{"class":61,"line":524},15,[59,526,341],{"emptyLinePlaceholder":340},[59,528,530,532,535],{"class":61,"line":529},16,[59,531,346],{"class":186},[59,533,534],{"class":65},"Injectable",[59,536,537],{"class":186},"()\n",[59,539,541,543,545,548],{"class":61,"line":540},17,[59,542,180],{"class":179},[59,544,379],{"class":179},[59,546,547],{"class":65}," Auth0Service",[59,549,445],{"class":186},[59,551,553,556,559,562,564],{"class":61,"line":552},18,[59,554,555],{"class":179},"  private",[59,557,558],{"class":179}," readonly",[59,560,561],{"class":450}," client",[59,563,454],{"class":179},[59,565,566],{"class":65}," ManagementClient\n",[59,568,570,572,574,577,580],{"class":61,"line":569},19,[59,571,555],{"class":179},[59,573,558],{"class":179},[59,575,576],{"class":450}," connection",[59,578,579],{"class":179}," =",[59,581,582],{"class":69}," 'Username-Password-Authentication'\n",[59,584,586],{"class":61,"line":585},20,[59,587,341],{"emptyLinePlaceholder":340},[59,589,591,594,597,600,603,605,608],{"class":61,"line":590},21,[59,592,593],{"class":179},"  constructor",[59,595,596],{"class":186},"(",[59,598,599],{"class":179},"private",[59,601,602],{"class":450}," configService",[59,604,454],{"class":179},[59,606,607],{"class":65}," ConfigService",[59,609,610],{"class":186},") {\n",[59,612,614,617,620,622,625,628],{"class":61,"line":613},22,[59,615,616],{"class":83},"    this",[59,618,619],{"class":186},".client ",[59,621,262],{"class":179},[59,623,624],{"class":179}," new",[59,626,627],{"class":65}," ManagementClient",[59,629,351],{"class":186},[59,631,633,636,639,642,645,648,651,654,657,660,663],{"class":61,"line":632},23,[59,634,635],{"class":186},"      domain: ",[59,637,638],{"class":83},"this",[59,640,641],{"class":186},".configService.",[59,643,644],{"class":65},"get",[59,646,647],{"class":186},"\u003C",[59,649,650],{"class":83},"string",[59,652,653],{"class":186},">(",[59,655,656],{"class":69},"'auth0.domain'",[59,658,659],{"class":186},")",[59,661,662],{"class":179},"!",[59,664,211],{"class":186},[59,666,668,671,673,675,677,679,681,683,686,688,690],{"class":61,"line":667},24,[59,669,670],{"class":186},"      clientId: ",[59,672,638],{"class":83},[59,674,641],{"class":186},[59,676,644],{"class":65},[59,678,647],{"class":186},[59,680,650],{"class":83},[59,682,653],{"class":186},[59,684,685],{"class":69},"'auth0.clientId'",[59,687,659],{"class":186},[59,689,662],{"class":179},[59,691,211],{"class":186},[59,693,695,698,700,702,704,706,708,710,713,715,717],{"class":61,"line":694},25,[59,696,697],{"class":186},"      clientSecret: ",[59,699,638],{"class":83},[59,701,641],{"class":186},[59,703,644],{"class":65},[59,705,647],{"class":186},[59,707,650],{"class":83},[59,709,653],{"class":186},[59,711,712],{"class":69},"'auth0.clientSecret'",[59,714,659],{"class":186},[59,716,662],{"class":179},[59,718,211],{"class":186},[59,720,722,725,728],{"class":61,"line":721},26,[59,723,724],{"class":186},"      scope: ",[59,726,727],{"class":69},"'create:users read:users update:users'",[59,729,211],{"class":186},[59,731,733],{"class":61,"line":732},27,[59,734,735],{"class":186},"    })\n",[59,737,739],{"class":61,"line":738},28,[59,740,741],{"class":186},"  }\n",[59,743,745],{"class":61,"line":744},29,[59,746,341],{"emptyLinePlaceholder":340},[59,748,750,753,756,758,761,763,765,767,769,772,774,777],{"class":61,"line":749},30,[59,751,752],{"class":179},"  async",[59,754,755],{"class":65}," createUser",[59,757,596],{"class":186},[59,759,760],{"class":450},"input",[59,762,454],{"class":179},[59,764,442],{"class":65},[59,766,659],{"class":186},[59,768,454],{"class":179},[59,770,771],{"class":65}," Promise",[59,773,647],{"class":186},[59,775,776],{"class":65},"CreateUserOutput",[59,778,779],{"class":186},"> {\n",[59,781,783,786],{"class":61,"line":782},31,[59,784,785],{"class":179},"    try",[59,787,445],{"class":186},[59,789,791,794,797,799,802,805,808,811],{"class":61,"line":790},32,[59,792,793],{"class":179},"      const",[59,795,796],{"class":83}," user",[59,798,579],{"class":179},[59,800,801],{"class":179}," await",[59,803,804],{"class":83}," this",[59,806,807],{"class":186},".client.",[59,809,810],{"class":65},"createUser",[59,812,351],{"class":186},[59,814,816,819,821],{"class":61,"line":815},33,[59,817,818],{"class":186},"        connection: ",[59,820,638],{"class":83},[59,822,823],{"class":186},".connection,\n",[59,825,827],{"class":61,"line":826},34,[59,828,829],{"class":186},"        email: input.email,\n",[59,831,833],{"class":61,"line":832},35,[59,834,835],{"class":186},"        password: input.password,\n",[59,837,839],{"class":61,"line":838},36,[59,840,841],{"class":186},"        name: input.name,\n",[59,843,845,848,851],{"class":61,"line":844},37,[59,846,847],{"class":186},"        email_verified: ",[59,849,850],{"class":83},"false",[59,852,211],{"class":186},[59,854,856],{"class":61,"line":855},38,[59,857,858],{"class":186},"      })\n",[59,860,862],{"class":61,"line":861},39,[59,863,341],{"emptyLinePlaceholder":340},[59,865,867,870,873,875],{"class":61,"line":866},40,[59,868,869],{"class":179},"      if",[59,871,872],{"class":186}," (",[59,874,662],{"class":179},[59,876,877],{"class":186},"user.user_id) {\n",[59,879,881,884,886,889,891,894],{"class":61,"line":880},41,[59,882,883],{"class":179},"        throw",[59,885,624],{"class":179},[59,887,888],{"class":65}," Error",[59,890,596],{"class":186},[59,892,893],{"class":69},"'User ID not returned from Auth0'",[59,895,896],{"class":186},")\n",[59,898,900],{"class":61,"line":899},42,[59,901,902],{"class":186},"      }\n",[59,904,906],{"class":61,"line":905},43,[59,907,341],{"emptyLinePlaceholder":340},[59,909,911,914],{"class":61,"line":910},44,[59,912,913],{"class":179},"      return",[59,915,445],{"class":186},[59,917,919],{"class":61,"line":918},45,[59,920,921],{"class":186},"        userId: user.user_id,\n",[59,923,925,928,930],{"class":61,"line":924},46,[59,926,927],{"class":186},"        email: user.email",[59,929,662],{"class":179},[59,931,211],{"class":186},[59,933,935],{"class":61,"line":934},47,[59,936,902],{"class":186},[59,938,940,943,946],{"class":61,"line":939},48,[59,941,942],{"class":186},"    } ",[59,944,945],{"class":179},"catch",[59,947,948],{"class":186}," (error) {\n",[59,950,952,955,958,961],{"class":61,"line":951},49,[59,953,954],{"class":83},"      this",[59,956,957],{"class":186},".",[59,959,960],{"class":65},"handleAuth0Error",[59,962,963],{"class":186},"(error)\n",[59,965,967],{"class":61,"line":966},50,[59,968,969],{"class":186},"    }\n",[59,971,973],{"class":61,"line":972},51,[59,974,741],{"class":186},[59,976,978],{"class":61,"line":977},52,[59,979,341],{"emptyLinePlaceholder":340},[59,981,983,985,988,990,993,995,998,1000,1002,1004,1006,1009],{"class":61,"line":982},53,[59,984,752],{"class":179},[59,986,987],{"class":65}," getUserById",[59,989,596],{"class":186},[59,991,992],{"class":450},"userId",[59,994,454],{"class":179},[59,996,997],{"class":83}," string",[59,999,659],{"class":186},[59,1001,454],{"class":179},[59,1003,771],{"class":65},[59,1005,647],{"class":186},[59,1007,1008],{"class":65},"User",[59,1010,779],{"class":186},[59,1012,1014,1016],{"class":61,"line":1013},54,[59,1015,785],{"class":179},[59,1017,445],{"class":186},[59,1019,1021,1023,1025,1027,1029,1032],{"class":61,"line":1020},55,[59,1022,913],{"class":179},[59,1024,801],{"class":179},[59,1026,804],{"class":83},[59,1028,807],{"class":186},[59,1030,1031],{"class":65},"getUser",[59,1033,1034],{"class":186},"({ id: userId })\n",[59,1036,1038,1040,1042],{"class":61,"line":1037},56,[59,1039,942],{"class":186},[59,1041,945],{"class":179},[59,1043,948],{"class":186},[59,1045,1047,1049,1051,1053],{"class":61,"line":1046},57,[59,1048,954],{"class":83},[59,1050,957],{"class":186},[59,1052,960],{"class":65},[59,1054,963],{"class":186},[59,1056,1058],{"class":61,"line":1057},58,[59,1059,969],{"class":186},[59,1061,1063],{"class":61,"line":1062},59,[59,1064,741],{"class":186},[59,1066,1068],{"class":61,"line":1067},60,[59,1069,341],{"emptyLinePlaceholder":340},[59,1071,1073,1075,1078,1080,1082,1084,1086,1089,1092,1094,1097,1099,1101,1104,1106,1108,1110,1112],{"class":61,"line":1072},61,[59,1074,752],{"class":179},[59,1076,1077],{"class":65}," updateUser",[59,1079,596],{"class":186},[59,1081,992],{"class":450},[59,1083,454],{"class":179},[59,1085,997],{"class":83},[59,1087,1088],{"class":186},", ",[59,1090,1091],{"class":450},"data",[59,1093,454],{"class":179},[59,1095,1096],{"class":65}," Partial",[59,1098,647],{"class":186},[59,1100,1008],{"class":65},[59,1102,1103],{"class":186},">)",[59,1105,454],{"class":179},[59,1107,771],{"class":65},[59,1109,647],{"class":186},[59,1111,1008],{"class":65},[59,1113,779],{"class":186},[59,1115,1117,1119],{"class":61,"line":1116},62,[59,1118,785],{"class":179},[59,1120,445],{"class":186},[59,1122,1124,1126,1128,1130,1132,1135],{"class":61,"line":1123},63,[59,1125,913],{"class":179},[59,1127,801],{"class":179},[59,1129,804],{"class":83},[59,1131,807],{"class":186},[59,1133,1134],{"class":65},"updateUser",[59,1136,1137],{"class":186},"({ id: userId }, data)\n",[59,1139,1141,1143,1145],{"class":61,"line":1140},64,[59,1142,942],{"class":186},[59,1144,945],{"class":179},[59,1146,948],{"class":186},[59,1148,1150,1152,1154,1156],{"class":61,"line":1149},65,[59,1151,954],{"class":83},[59,1153,957],{"class":186},[59,1155,960],{"class":65},[59,1157,963],{"class":186},[59,1159,1161],{"class":61,"line":1160},66,[59,1162,969],{"class":186},[59,1164,1166],{"class":61,"line":1165},67,[59,1167,741],{"class":186},[59,1169,1171],{"class":61,"line":1170},68,[59,1172,341],{"emptyLinePlaceholder":340},[59,1174,1176,1178,1181,1183,1185,1187,1189,1191,1193,1195,1197,1200],{"class":61,"line":1175},69,[59,1177,752],{"class":179},[59,1179,1180],{"class":65}," deleteUser",[59,1182,596],{"class":186},[59,1184,992],{"class":450},[59,1186,454],{"class":179},[59,1188,997],{"class":83},[59,1190,659],{"class":186},[59,1192,454],{"class":179},[59,1194,771],{"class":65},[59,1196,647],{"class":186},[59,1198,1199],{"class":83},"void",[59,1201,779],{"class":186},[59,1203,1205,1207],{"class":61,"line":1204},70,[59,1206,785],{"class":179},[59,1208,445],{"class":186},[59,1210,1212,1215,1217,1219,1222],{"class":61,"line":1211},71,[59,1213,1214],{"class":179},"      await",[59,1216,804],{"class":83},[59,1218,807],{"class":186},[59,1220,1221],{"class":65},"deleteUser",[59,1223,1034],{"class":186},[59,1225,1227,1229,1231],{"class":61,"line":1226},72,[59,1228,942],{"class":186},[59,1230,945],{"class":179},[59,1232,948],{"class":186},[59,1234,1236,1238,1240,1242],{"class":61,"line":1235},73,[59,1237,954],{"class":83},[59,1239,957],{"class":186},[59,1241,960],{"class":65},[59,1243,963],{"class":186},[59,1245,1247],{"class":61,"line":1246},74,[59,1248,969],{"class":186},[59,1250,1252],{"class":61,"line":1251},75,[59,1253,741],{"class":186},[59,1255,1257],{"class":61,"line":1256},76,[59,1258,341],{"emptyLinePlaceholder":340},[59,1260,1262,1264,1267,1269,1272,1274,1277,1279,1281,1284],{"class":61,"line":1261},77,[59,1263,555],{"class":179},[59,1265,1266],{"class":65}," handleAuth0Error",[59,1268,596],{"class":186},[59,1270,1271],{"class":450},"error",[59,1273,454],{"class":179},[59,1275,1276],{"class":83}," any",[59,1278,659],{"class":186},[59,1280,454],{"class":179},[59,1282,1283],{"class":83}," never",[59,1285,445],{"class":186},[59,1287,1289,1292,1295,1298,1301],{"class":61,"line":1288},78,[59,1290,1291],{"class":179},"    if",[59,1293,1294],{"class":186}," (error.statusCode ",[59,1296,1297],{"class":179},"===",[59,1299,1300],{"class":83}," 409",[59,1302,610],{"class":186},[59,1304,1306,1309,1311,1314,1316,1319],{"class":61,"line":1305},79,[59,1307,1308],{"class":179},"      throw",[59,1310,624],{"class":179},[59,1312,1313],{"class":65}," InternalServerErrorException",[59,1315,596],{"class":186},[59,1317,1318],{"class":69},"'User already exists'",[59,1320,896],{"class":186},[59,1322,1324],{"class":61,"line":1323},80,[59,1325,969],{"class":186},[59,1327,1329],{"class":61,"line":1328},81,[59,1330,341],{"emptyLinePlaceholder":340},[59,1332,1334,1336,1338,1340,1343],{"class":61,"line":1333},82,[59,1335,1291],{"class":179},[59,1337,1294],{"class":186},[59,1339,1297],{"class":179},[59,1341,1342],{"class":83}," 400",[59,1344,610],{"class":186},[59,1346,1348,1350,1352,1354],{"class":61,"line":1347},83,[59,1349,1308],{"class":179},[59,1351,624],{"class":179},[59,1353,1313],{"class":65},[59,1355,1356],{"class":186},"(\n",[59,1358,1360,1363,1365,1367,1370,1373],{"class":61,"line":1359},84,[59,1361,1362],{"class":69},"        `Invalid input: ${",[59,1364,1271],{"class":186},[59,1366,957],{"class":69},[59,1368,1369],{"class":186},"message",[59,1371,1372],{"class":69},"}`",[59,1374,211],{"class":186},[59,1376,1378],{"class":61,"line":1377},85,[59,1379,1380],{"class":186},"      )\n",[59,1382,1384],{"class":61,"line":1383},86,[59,1385,969],{"class":186},[59,1387,1389],{"class":61,"line":1388},87,[59,1390,341],{"emptyLinePlaceholder":340},[59,1392,1394,1397,1399,1401],{"class":61,"line":1393},88,[59,1395,1396],{"class":179},"    throw",[59,1398,624],{"class":179},[59,1400,1313],{"class":65},[59,1402,1356],{"class":186},[59,1404,1406,1409,1411,1413,1415,1418,1421],{"class":61,"line":1405},89,[59,1407,1408],{"class":69},"      `Auth0 error: ${",[59,1410,1271],{"class":186},[59,1412,957],{"class":69},[59,1414,1369],{"class":186},[59,1416,1417],{"class":179}," ||",[59,1419,1420],{"class":69}," 'Unknown error'}`",[59,1422,211],{"class":186},[59,1424,1426],{"class":61,"line":1425},90,[59,1427,1428],{"class":186},"    )\n",[59,1430,1432],{"class":61,"line":1431},91,[59,1433,741],{"class":186},[59,1435,1437],{"class":61,"line":1436},92,[59,1438,481],{"class":186},[10,1440,1442],{"id":1441},"rest-apiでの実装例","REST APIでの実装例",[44,1444,1446],{"id":1445},"controller","Controller",[49,1448,1450],{"className":164,"code":1449,"language":166,"meta":54,"style":54},"import {\n  Body,\n  Controller,\n  Delete,\n  Get,\n  Param,\n  Post,\n  Put,\n} from '@nestjs\u002Fcommon'\nimport { Auth0Service, CreateUserInput } from '.\u002Fauth0.service'\n\nexport class CreateUserDto {\n  email: string\n  password: string\n  name?: string\n}\n\nexport class UpdateUserDto {\n  name?: string\n  email?: string\n}\n\n@Controller('users')\nexport class UsersController {\n  constructor(private readonly auth0Service: Auth0Service) {}\n\n  @Post()\n  async createUser(@Body() dto: CreateUserDto) {\n    return this.auth0Service.createUser(dto)\n  }\n\n  @Get(':userId')\n  async getUser(@Param('userId') userId: string) {\n    return this.auth0Service.getUserById(userId)\n  }\n\n  @Put(':userId')\n  async updateUser(\n    @Param('userId') userId: string,\n    @Body() dto: UpdateUserDto,\n  ) {\n    return this.auth0Service.updateUser(userId, dto)\n  }\n\n  @Delete(':userId')\n  async deleteUser(@Param('userId') userId: string) {\n    await this.auth0Service.deleteUser(userId)\n    return { message: 'User deleted successfully' }\n  }\n}\n",[56,1451,1452,1458,1463,1468,1473,1478,1483,1488,1493,1502,1513,1517,1528,1536,1544,1552,1556,1560,1571,1579,1587,1591,1595,1608,1619,1639,1643,1653,1677,1692,1696,1700,1714,1742,1756,1760,1764,1777,1785,1806,1822,1827,1840,1844,1848,1861,1885,1898,1911,1915],{"__ignoreMap":54},[59,1453,1454,1456],{"class":61,"line":62},[59,1455,302],{"class":179},[59,1457,445],{"class":186},[59,1459,1460],{"class":61,"line":76},[59,1461,1462],{"class":186},"  Body,\n",[59,1464,1465],{"class":61,"line":196},[59,1466,1467],{"class":186},"  Controller,\n",[59,1469,1470],{"class":61,"line":202},[59,1471,1472],{"class":186},"  Delete,\n",[59,1474,1475],{"class":61,"line":214},[59,1476,1477],{"class":186},"  Get,\n",[59,1479,1480],{"class":61,"line":225},[59,1481,1482],{"class":186},"  Param,\n",[59,1484,1485],{"class":61,"line":236},[59,1486,1487],{"class":186},"  Post,\n",[59,1489,1490],{"class":61,"line":242},[59,1491,1492],{"class":186},"  Put,\n",[59,1494,1495,1498,1500],{"class":61,"line":369},[59,1496,1497],{"class":186},"} ",[59,1499,308],{"class":179},[59,1501,311],{"class":69},[59,1503,1504,1506,1509,1511],{"class":61,"line":374},[59,1505,302],{"class":179},[59,1507,1508],{"class":186}," { Auth0Service, CreateUserInput } ",[59,1510,308],{"class":179},[59,1512,335],{"class":69},[59,1514,1515],{"class":61,"line":488},[59,1516,341],{"emptyLinePlaceholder":340},[59,1518,1519,1521,1523,1526],{"class":61,"line":500},[59,1520,180],{"class":179},[59,1522,379],{"class":179},[59,1524,1525],{"class":65}," CreateUserDto",[59,1527,445],{"class":186},[59,1529,1530,1532,1534],{"class":61,"line":510},[59,1531,451],{"class":450},[59,1533,454],{"class":179},[59,1535,457],{"class":83},[59,1537,1538,1540,1542],{"class":61,"line":519},[59,1539,462],{"class":450},[59,1541,454],{"class":179},[59,1543,457],{"class":83},[59,1545,1546,1548,1550],{"class":61,"line":524},[59,1547,471],{"class":450},[59,1549,474],{"class":179},[59,1551,457],{"class":83},[59,1553,1554],{"class":61,"line":529},[59,1555,481],{"class":186},[59,1557,1558],{"class":61,"line":540},[59,1559,341],{"emptyLinePlaceholder":340},[59,1561,1562,1564,1566,1569],{"class":61,"line":552},[59,1563,180],{"class":179},[59,1565,379],{"class":179},[59,1567,1568],{"class":65}," UpdateUserDto",[59,1570,445],{"class":186},[59,1572,1573,1575,1577],{"class":61,"line":569},[59,1574,471],{"class":450},[59,1576,474],{"class":179},[59,1578,457],{"class":83},[59,1580,1581,1583,1585],{"class":61,"line":585},[59,1582,451],{"class":450},[59,1584,474],{"class":179},[59,1586,457],{"class":83},[59,1588,1589],{"class":61,"line":590},[59,1590,481],{"class":186},[59,1592,1593],{"class":61,"line":613},[59,1594,341],{"emptyLinePlaceholder":340},[59,1596,1597,1599,1601,1603,1606],{"class":61,"line":632},[59,1598,346],{"class":186},[59,1600,1446],{"class":65},[59,1602,596],{"class":186},[59,1604,1605],{"class":69},"'users'",[59,1607,896],{"class":186},[59,1609,1610,1612,1614,1617],{"class":61,"line":667},[59,1611,180],{"class":179},[59,1613,379],{"class":179},[59,1615,1616],{"class":65}," UsersController",[59,1618,445],{"class":186},[59,1620,1621,1623,1625,1627,1629,1632,1634,1636],{"class":61,"line":694},[59,1622,593],{"class":179},[59,1624,596],{"class":186},[59,1626,599],{"class":179},[59,1628,558],{"class":179},[59,1630,1631],{"class":450}," auth0Service",[59,1633,454],{"class":179},[59,1635,547],{"class":65},[59,1637,1638],{"class":186},") {}\n",[59,1640,1641],{"class":61,"line":721},[59,1642,341],{"emptyLinePlaceholder":340},[59,1644,1645,1648,1651],{"class":61,"line":732},[59,1646,1647],{"class":186},"  @",[59,1649,1650],{"class":65},"Post",[59,1652,537],{"class":186},[59,1654,1655,1657,1659,1662,1665,1668,1671,1673,1675],{"class":61,"line":738},[59,1656,752],{"class":179},[59,1658,755],{"class":65},[59,1660,1661],{"class":186},"(@",[59,1663,1664],{"class":65},"Body",[59,1666,1667],{"class":186},"() ",[59,1669,1670],{"class":450},"dto",[59,1672,454],{"class":179},[59,1674,1525],{"class":65},[59,1676,610],{"class":186},[59,1678,1679,1682,1684,1687,1689],{"class":61,"line":744},[59,1680,1681],{"class":179},"    return",[59,1683,804],{"class":83},[59,1685,1686],{"class":186},".auth0Service.",[59,1688,810],{"class":65},[59,1690,1691],{"class":186},"(dto)\n",[59,1693,1694],{"class":61,"line":749},[59,1695,741],{"class":186},[59,1697,1698],{"class":61,"line":782},[59,1699,341],{"emptyLinePlaceholder":340},[59,1701,1702,1704,1707,1709,1712],{"class":61,"line":790},[59,1703,1647],{"class":186},[59,1705,1706],{"class":65},"Get",[59,1708,596],{"class":186},[59,1710,1711],{"class":69},"':userId'",[59,1713,896],{"class":186},[59,1715,1716,1718,1721,1723,1726,1728,1731,1734,1736,1738,1740],{"class":61,"line":815},[59,1717,752],{"class":179},[59,1719,1720],{"class":65}," getUser",[59,1722,1661],{"class":186},[59,1724,1725],{"class":65},"Param",[59,1727,596],{"class":186},[59,1729,1730],{"class":69},"'userId'",[59,1732,1733],{"class":186},") ",[59,1735,992],{"class":450},[59,1737,454],{"class":179},[59,1739,997],{"class":83},[59,1741,610],{"class":186},[59,1743,1744,1746,1748,1750,1753],{"class":61,"line":826},[59,1745,1681],{"class":179},[59,1747,804],{"class":83},[59,1749,1686],{"class":186},[59,1751,1752],{"class":65},"getUserById",[59,1754,1755],{"class":186},"(userId)\n",[59,1757,1758],{"class":61,"line":832},[59,1759,741],{"class":186},[59,1761,1762],{"class":61,"line":838},[59,1763,341],{"emptyLinePlaceholder":340},[59,1765,1766,1768,1771,1773,1775],{"class":61,"line":844},[59,1767,1647],{"class":186},[59,1769,1770],{"class":65},"Put",[59,1772,596],{"class":186},[59,1774,1711],{"class":69},[59,1776,896],{"class":186},[59,1778,1779,1781,1783],{"class":61,"line":855},[59,1780,752],{"class":179},[59,1782,1077],{"class":65},[59,1784,1356],{"class":186},[59,1786,1787,1790,1792,1794,1796,1798,1800,1802,1804],{"class":61,"line":861},[59,1788,1789],{"class":186},"    @",[59,1791,1725],{"class":65},[59,1793,596],{"class":186},[59,1795,1730],{"class":69},[59,1797,1733],{"class":186},[59,1799,992],{"class":450},[59,1801,454],{"class":179},[59,1803,997],{"class":83},[59,1805,211],{"class":186},[59,1807,1808,1810,1812,1814,1816,1818,1820],{"class":61,"line":866},[59,1809,1789],{"class":186},[59,1811,1664],{"class":65},[59,1813,1667],{"class":186},[59,1815,1670],{"class":450},[59,1817,454],{"class":179},[59,1819,1568],{"class":65},[59,1821,211],{"class":186},[59,1823,1824],{"class":61,"line":880},[59,1825,1826],{"class":186},"  ) {\n",[59,1828,1829,1831,1833,1835,1837],{"class":61,"line":899},[59,1830,1681],{"class":179},[59,1832,804],{"class":83},[59,1834,1686],{"class":186},[59,1836,1134],{"class":65},[59,1838,1839],{"class":186},"(userId, dto)\n",[59,1841,1842],{"class":61,"line":905},[59,1843,741],{"class":186},[59,1845,1846],{"class":61,"line":910},[59,1847,341],{"emptyLinePlaceholder":340},[59,1849,1850,1852,1855,1857,1859],{"class":61,"line":918},[59,1851,1647],{"class":186},[59,1853,1854],{"class":65},"Delete",[59,1856,596],{"class":186},[59,1858,1711],{"class":69},[59,1860,896],{"class":186},[59,1862,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883],{"class":61,"line":924},[59,1864,752],{"class":179},[59,1866,1180],{"class":65},[59,1868,1661],{"class":186},[59,1870,1725],{"class":65},[59,1872,596],{"class":186},[59,1874,1730],{"class":69},[59,1876,1733],{"class":186},[59,1878,992],{"class":450},[59,1880,454],{"class":179},[59,1882,997],{"class":83},[59,1884,610],{"class":186},[59,1886,1887,1890,1892,1894,1896],{"class":61,"line":934},[59,1888,1889],{"class":179},"    await",[59,1891,804],{"class":83},[59,1893,1686],{"class":186},[59,1895,1221],{"class":65},[59,1897,1755],{"class":186},[59,1899,1900,1902,1905,1908],{"class":61,"line":939},[59,1901,1681],{"class":179},[59,1903,1904],{"class":186}," { message: ",[59,1906,1907],{"class":69},"'User deleted successfully'",[59,1909,1910],{"class":186}," }\n",[59,1912,1913],{"class":61,"line":951},[59,1914,741],{"class":186},[59,1916,1917],{"class":61,"line":966},[59,1918,481],{"class":186},[44,1920,1922],{"id":1921},"dtoのバリデーション","DTOのバリデーション",[49,1924,1926],{"className":164,"code":1925,"language":166,"meta":54,"style":54},"import { IsEmail, IsString, MinLength, IsOptional } from 'class-validator'\n\nexport class CreateUserDto {\n  @IsEmail()\n  email: string\n\n  @IsString()\n  @MinLength(8)\n  password: string\n\n  @IsString()\n  @IsOptional()\n  name?: string\n}\n",[56,1927,1928,1940,1944,1954,1963,1971,1975,1984,1998,2006,2010,2018,2027,2035],{"__ignoreMap":54},[59,1929,1930,1932,1935,1937],{"class":61,"line":62},[59,1931,302],{"class":179},[59,1933,1934],{"class":186}," { IsEmail, IsString, MinLength, IsOptional } ",[59,1936,308],{"class":179},[59,1938,1939],{"class":69}," 'class-validator'\n",[59,1941,1942],{"class":61,"line":76},[59,1943,341],{"emptyLinePlaceholder":340},[59,1945,1946,1948,1950,1952],{"class":61,"line":196},[59,1947,180],{"class":179},[59,1949,379],{"class":179},[59,1951,1525],{"class":65},[59,1953,445],{"class":186},[59,1955,1956,1958,1961],{"class":61,"line":202},[59,1957,1647],{"class":186},[59,1959,1960],{"class":65},"IsEmail",[59,1962,537],{"class":186},[59,1964,1965,1967,1969],{"class":61,"line":214},[59,1966,451],{"class":450},[59,1968,454],{"class":179},[59,1970,457],{"class":83},[59,1972,1973],{"class":61,"line":225},[59,1974,341],{"emptyLinePlaceholder":340},[59,1976,1977,1979,1982],{"class":61,"line":236},[59,1978,1647],{"class":186},[59,1980,1981],{"class":65},"IsString",[59,1983,537],{"class":186},[59,1985,1986,1988,1991,1993,1996],{"class":61,"line":242},[59,1987,1647],{"class":186},[59,1989,1990],{"class":65},"MinLength",[59,1992,596],{"class":186},[59,1994,1995],{"class":83},"8",[59,1997,896],{"class":186},[59,1999,2000,2002,2004],{"class":61,"line":369},[59,2001,462],{"class":450},[59,2003,454],{"class":179},[59,2005,457],{"class":83},[59,2007,2008],{"class":61,"line":374},[59,2009,341],{"emptyLinePlaceholder":340},[59,2011,2012,2014,2016],{"class":61,"line":488},[59,2013,1647],{"class":186},[59,2015,1981],{"class":65},[59,2017,537],{"class":186},[59,2019,2020,2022,2025],{"class":61,"line":500},[59,2021,1647],{"class":186},[59,2023,2024],{"class":65},"IsOptional",[59,2026,537],{"class":186},[59,2028,2029,2031,2033],{"class":61,"line":510},[59,2030,471],{"class":450},[59,2032,474],{"class":179},[59,2034,457],{"class":83},[59,2036,2037],{"class":61,"line":519},[59,2038,481],{"class":186},[49,2040,2042],{"className":51,"code":2041,"language":53,"meta":54,"style":54},"npm install class-validator class-transformer\n",[56,2043,2044],{"__ignoreMap":54},[59,2045,2046,2048,2050,2053],{"class":61,"line":62},[59,2047,66],{"class":65},[59,2049,70],{"class":69},[59,2051,2052],{"class":69}," class-validator",[59,2054,2055],{"class":69}," class-transformer\n",[10,2057,2059],{"id":2058},"graphql-apiでの実装例","GraphQL APIでの実装例",[44,2061,2063],{"id":2062},"types","Types",[49,2065,2067],{"className":164,"code":2066,"language":166,"meta":54,"style":54},"import { Field, InputType, ObjectType } from '@nestjs\u002Fgraphql'\n\n@InputType()\nexport class CreateUserInput {\n  @Field()\n  email: string\n\n  @Field()\n  password: string\n\n  @Field({ nullable: true })\n  name?: string\n}\n\n@ObjectType()\nexport class CreateUserOutput {\n  @Field()\n  userId: string\n\n  @Field()\n  email: string\n}\n",[56,2068,2069,2081,2085,2094,2104,2113,2121,2125,2133,2141,2145,2160,2168,2172,2176,2185,2195,2203,2211,2215,2223,2231],{"__ignoreMap":54},[59,2070,2071,2073,2076,2078],{"class":61,"line":62},[59,2072,302],{"class":179},[59,2074,2075],{"class":186}," { Field, InputType, ObjectType } ",[59,2077,308],{"class":179},[59,2079,2080],{"class":69}," '@nestjs\u002Fgraphql'\n",[59,2082,2083],{"class":61,"line":76},[59,2084,341],{"emptyLinePlaceholder":340},[59,2086,2087,2089,2092],{"class":61,"line":196},[59,2088,346],{"class":186},[59,2090,2091],{"class":65},"InputType",[59,2093,537],{"class":186},[59,2095,2096,2098,2100,2102],{"class":61,"line":202},[59,2097,180],{"class":179},[59,2099,379],{"class":179},[59,2101,442],{"class":65},[59,2103,445],{"class":186},[59,2105,2106,2108,2111],{"class":61,"line":214},[59,2107,1647],{"class":186},[59,2109,2110],{"class":65},"Field",[59,2112,537],{"class":186},[59,2114,2115,2117,2119],{"class":61,"line":225},[59,2116,451],{"class":450},[59,2118,454],{"class":179},[59,2120,457],{"class":83},[59,2122,2123],{"class":61,"line":236},[59,2124,341],{"emptyLinePlaceholder":340},[59,2126,2127,2129,2131],{"class":61,"line":242},[59,2128,1647],{"class":186},[59,2130,2110],{"class":65},[59,2132,537],{"class":186},[59,2134,2135,2137,2139],{"class":61,"line":369},[59,2136,462],{"class":450},[59,2138,454],{"class":179},[59,2140,457],{"class":83},[59,2142,2143],{"class":61,"line":374},[59,2144,341],{"emptyLinePlaceholder":340},[59,2146,2147,2149,2151,2154,2157],{"class":61,"line":488},[59,2148,1647],{"class":186},[59,2150,2110],{"class":65},[59,2152,2153],{"class":186},"({ nullable: ",[59,2155,2156],{"class":83},"true",[59,2158,2159],{"class":186}," })\n",[59,2161,2162,2164,2166],{"class":61,"line":500},[59,2163,471],{"class":450},[59,2165,474],{"class":179},[59,2167,457],{"class":83},[59,2169,2170],{"class":61,"line":510},[59,2171,481],{"class":186},[59,2173,2174],{"class":61,"line":519},[59,2175,341],{"emptyLinePlaceholder":340},[59,2177,2178,2180,2183],{"class":61,"line":524},[59,2179,346],{"class":186},[59,2181,2182],{"class":65},"ObjectType",[59,2184,537],{"class":186},[59,2186,2187,2189,2191,2193],{"class":61,"line":529},[59,2188,180],{"class":179},[59,2190,379],{"class":179},[59,2192,495],{"class":65},[59,2194,445],{"class":186},[59,2196,2197,2199,2201],{"class":61,"line":540},[59,2198,1647],{"class":186},[59,2200,2110],{"class":65},[59,2202,537],{"class":186},[59,2204,2205,2207,2209],{"class":61,"line":552},[59,2206,503],{"class":450},[59,2208,454],{"class":179},[59,2210,457],{"class":83},[59,2212,2213],{"class":61,"line":569},[59,2214,341],{"emptyLinePlaceholder":340},[59,2216,2217,2219,2221],{"class":61,"line":585},[59,2218,1647],{"class":186},[59,2220,2110],{"class":65},[59,2222,537],{"class":186},[59,2224,2225,2227,2229],{"class":61,"line":590},[59,2226,451],{"class":450},[59,2228,454],{"class":179},[59,2230,457],{"class":83},[59,2232,2233],{"class":61,"line":613},[59,2234,481],{"class":186},[44,2236,2238],{"id":2237},"resolver","Resolver",[49,2240,2242],{"className":164,"code":2241,"language":166,"meta":54,"style":54},"import { Args, Mutation, Query, Resolver } from '@nestjs\u002Fgraphql'\nimport { Auth0Service } from '..\u002Fauth0\u002Fauth0.service'\nimport { CreateUserInput, CreateUserOutput } from '.\u002Fuser.types'\n\n@Resolver()\nexport class UsersResolver {\n  constructor(private readonly auth0Service: Auth0Service) {}\n\n  @Mutation(() => CreateUserOutput)\n  async createUser(\n    @Args('input') input: CreateUserInput,\n  ): Promise\u003CCreateUserOutput> {\n    return this.auth0Service.createUser(input)\n  }\n\n  @Query(() => String)\n  async getUserById(@Args('userId') userId: string) {\n    const user = await this.auth0Service.getUserById(userId)\n    return JSON.stringify(user)\n  }\n}\n",[56,2243,2244,2255,2266,2278,2282,2290,2301,2319,2323,2338,2346,2368,2383,2396,2400,2404,2418,2442,2461,2476,2480],{"__ignoreMap":54},[59,2245,2246,2248,2251,2253],{"class":61,"line":62},[59,2247,302],{"class":179},[59,2249,2250],{"class":186}," { Args, Mutation, Query, Resolver } ",[59,2252,308],{"class":179},[59,2254,2080],{"class":69},[59,2256,2257,2259,2261,2263],{"class":61,"line":76},[59,2258,302],{"class":179},[59,2260,330],{"class":186},[59,2262,308],{"class":179},[59,2264,2265],{"class":69}," '..\u002Fauth0\u002Fauth0.service'\n",[59,2267,2268,2270,2273,2275],{"class":61,"line":196},[59,2269,302],{"class":179},[59,2271,2272],{"class":186}," { CreateUserInput, CreateUserOutput } ",[59,2274,308],{"class":179},[59,2276,2277],{"class":69}," '.\u002Fuser.types'\n",[59,2279,2280],{"class":61,"line":202},[59,2281,341],{"emptyLinePlaceholder":340},[59,2283,2284,2286,2288],{"class":61,"line":214},[59,2285,346],{"class":186},[59,2287,2238],{"class":65},[59,2289,537],{"class":186},[59,2291,2292,2294,2296,2299],{"class":61,"line":225},[59,2293,180],{"class":179},[59,2295,379],{"class":179},[59,2297,2298],{"class":65}," UsersResolver",[59,2300,445],{"class":186},[59,2302,2303,2305,2307,2309,2311,2313,2315,2317],{"class":61,"line":236},[59,2304,593],{"class":179},[59,2306,596],{"class":186},[59,2308,599],{"class":179},[59,2310,558],{"class":179},[59,2312,1631],{"class":450},[59,2314,454],{"class":179},[59,2316,547],{"class":65},[59,2318,1638],{"class":186},[59,2320,2321],{"class":61,"line":242},[59,2322,341],{"emptyLinePlaceholder":340},[59,2324,2325,2327,2330,2333,2335],{"class":61,"line":369},[59,2326,1647],{"class":186},[59,2328,2329],{"class":65},"Mutation",[59,2331,2332],{"class":186},"(() ",[59,2334,190],{"class":179},[59,2336,2337],{"class":186}," CreateUserOutput)\n",[59,2339,2340,2342,2344],{"class":61,"line":374},[59,2341,752],{"class":179},[59,2343,755],{"class":65},[59,2345,1356],{"class":186},[59,2347,2348,2350,2353,2355,2358,2360,2362,2364,2366],{"class":61,"line":488},[59,2349,1789],{"class":186},[59,2351,2352],{"class":65},"Args",[59,2354,596],{"class":186},[59,2356,2357],{"class":69},"'input'",[59,2359,1733],{"class":186},[59,2361,760],{"class":450},[59,2363,454],{"class":179},[59,2365,442],{"class":65},[59,2367,211],{"class":186},[59,2369,2370,2373,2375,2377,2379,2381],{"class":61,"line":500},[59,2371,2372],{"class":186},"  )",[59,2374,454],{"class":179},[59,2376,771],{"class":65},[59,2378,647],{"class":186},[59,2380,776],{"class":65},[59,2382,779],{"class":186},[59,2384,2385,2387,2389,2391,2393],{"class":61,"line":510},[59,2386,1681],{"class":179},[59,2388,804],{"class":83},[59,2390,1686],{"class":186},[59,2392,810],{"class":65},[59,2394,2395],{"class":186},"(input)\n",[59,2397,2398],{"class":61,"line":519},[59,2399,741],{"class":186},[59,2401,2402],{"class":61,"line":524},[59,2403,341],{"emptyLinePlaceholder":340},[59,2405,2406,2408,2411,2413,2415],{"class":61,"line":529},[59,2407,1647],{"class":186},[59,2409,2410],{"class":65},"Query",[59,2412,2332],{"class":186},[59,2414,190],{"class":179},[59,2416,2417],{"class":186}," String)\n",[59,2419,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440],{"class":61,"line":540},[59,2421,752],{"class":179},[59,2423,987],{"class":65},[59,2425,1661],{"class":186},[59,2427,2352],{"class":65},[59,2429,596],{"class":186},[59,2431,1730],{"class":69},[59,2433,1733],{"class":186},[59,2435,992],{"class":450},[59,2437,454],{"class":179},[59,2439,997],{"class":83},[59,2441,610],{"class":186},[59,2443,2444,2447,2449,2451,2453,2455,2457,2459],{"class":61,"line":552},[59,2445,2446],{"class":179},"    const",[59,2448,796],{"class":83},[59,2450,579],{"class":179},[59,2452,801],{"class":179},[59,2454,804],{"class":83},[59,2456,1686],{"class":186},[59,2458,1752],{"class":65},[59,2460,1755],{"class":186},[59,2462,2463,2465,2468,2470,2473],{"class":61,"line":569},[59,2464,1681],{"class":179},[59,2466,2467],{"class":83}," JSON",[59,2469,957],{"class":186},[59,2471,2472],{"class":65},"stringify",[59,2474,2475],{"class":186},"(user)\n",[59,2477,2478],{"class":61,"line":585},[59,2479,741],{"class":186},[59,2481,2482],{"class":61,"line":590},[59,2483,481],{"class":186},[44,2485,2487],{"id":2486},"graphqlクエリ例","GraphQLクエリ例",[49,2489,2493],{"className":2490,"code":2491,"language":2492,"meta":54,"style":54},"language-graphql shiki shiki-themes github-light github-dark","# ユーザー作成\nmutation CreateUser {\n  createUser(\n    input: {\n      email: \"user@example.com\"\n      password: \"SecurePassword123!\"\n      name: \"John Doe\"\n    }\n  ) {\n    userId\n    email\n  }\n}\n\n# ユーザー取得\nquery GetUser {\n  getUserById(userId: \"auth0|123456789\")\n}\n","graphql",[56,2494,2495,2500,2505,2510,2515,2520,2525,2530,2534,2538,2543,2548,2552,2556,2560,2565,2570,2575],{"__ignoreMap":54},[59,2496,2497],{"class":61,"line":62},[59,2498,2499],{},"# ユーザー作成\n",[59,2501,2502],{"class":61,"line":76},[59,2503,2504],{},"mutation CreateUser {\n",[59,2506,2507],{"class":61,"line":196},[59,2508,2509],{},"  createUser(\n",[59,2511,2512],{"class":61,"line":202},[59,2513,2514],{},"    input: {\n",[59,2516,2517],{"class":61,"line":214},[59,2518,2519],{},"      email: \"user@example.com\"\n",[59,2521,2522],{"class":61,"line":225},[59,2523,2524],{},"      password: \"SecurePassword123!\"\n",[59,2526,2527],{"class":61,"line":236},[59,2528,2529],{},"      name: \"John Doe\"\n",[59,2531,2532],{"class":61,"line":242},[59,2533,969],{},[59,2535,2536],{"class":61,"line":369},[59,2537,1826],{},[59,2539,2540],{"class":61,"line":374},[59,2541,2542],{},"    userId\n",[59,2544,2545],{"class":61,"line":488},[59,2546,2547],{},"    email\n",[59,2549,2550],{"class":61,"line":500},[59,2551,741],{},[59,2553,2554],{"class":61,"line":510},[59,2555,481],{},[59,2557,2558],{"class":61,"line":519},[59,2559,341],{"emptyLinePlaceholder":340},[59,2561,2562],{"class":61,"line":524},[59,2563,2564],{},"# ユーザー取得\n",[59,2566,2567],{"class":61,"line":529},[59,2568,2569],{},"query GetUser {\n",[59,2571,2572],{"class":61,"line":540},[59,2573,2574],{},"  getUserById(userId: \"auth0|123456789\")\n",[59,2576,2577],{"class":61,"line":552},[59,2578,481],{},[10,2580,2581],{"id":2581},"セキュリティのベストプラクティス",[44,2583,2585],{"id":2584},"_1-パスワードポリシー","1. パスワードポリシー",[15,2587,2588],{},"Auth0側でパスワードポリシーを設定します",[25,2590,2591,2594,2597],{},[28,2592,2593],{},"最小8文字以上",[28,2595,2596],{},"大文字・小文字・数字・記号を含む",[28,2598,2599],{},"一般的なパスワードを禁止",[44,2601,2603],{"id":2602},"_2-環境変数の管理","2. 環境変数の管理",[49,2605,2607],{"className":164,"code":2606,"language":166,"meta":54,"style":54},"\u002F\u002F ❌ ハードコード（危険）\nconst client = new ManagementClient({\n  domain: 'your-tenant.auth0.com',\n  clientId: 'hardcoded-id',\n  clientSecret: 'hardcoded-secret',\n})\n\n\u002F\u002F ✅ 環境変数で管理\nconst client = new ManagementClient({\n  domain: process.env.AUTH0_DOMAIN!,\n  clientId: process.env.AUTH0_CLIENT_ID!,\n  clientSecret: process.env.AUTH0_CLIENT_SECRET!,\n})\n",[56,2608,2609,2614,2629,2639,2649,2659,2663,2667,2672,2686,2697,2708,2719],{"__ignoreMap":54},[59,2610,2611],{"class":61,"line":62},[59,2612,2613],{"class":173},"\u002F\u002F ❌ ハードコード（危険）\n",[59,2615,2616,2619,2621,2623,2625,2627],{"class":61,"line":76},[59,2617,2618],{"class":179},"const",[59,2620,561],{"class":83},[59,2622,579],{"class":179},[59,2624,624],{"class":179},[59,2626,627],{"class":65},[59,2628,351],{"class":186},[59,2630,2631,2634,2637],{"class":61,"line":196},[59,2632,2633],{"class":186},"  domain: ",[59,2635,2636],{"class":69},"'your-tenant.auth0.com'",[59,2638,211],{"class":186},[59,2640,2641,2644,2647],{"class":61,"line":202},[59,2642,2643],{"class":186},"  clientId: ",[59,2645,2646],{"class":69},"'hardcoded-id'",[59,2648,211],{"class":186},[59,2650,2651,2654,2657],{"class":61,"line":214},[59,2652,2653],{"class":186},"  clientSecret: ",[59,2655,2656],{"class":69},"'hardcoded-secret'",[59,2658,211],{"class":186},[59,2660,2661],{"class":61,"line":225},[59,2662,245],{"class":186},[59,2664,2665],{"class":61,"line":236},[59,2666,341],{"emptyLinePlaceholder":340},[59,2668,2669],{"class":61,"line":242},[59,2670,2671],{"class":173},"\u002F\u002F ✅ 環境変数で管理\n",[59,2673,2674,2676,2678,2680,2682,2684],{"class":61,"line":369},[59,2675,2618],{"class":179},[59,2677,561],{"class":83},[59,2679,579],{"class":179},[59,2681,624],{"class":179},[59,2683,627],{"class":65},[59,2685,351],{"class":186},[59,2687,2688,2691,2693,2695],{"class":61,"line":374},[59,2689,2690],{"class":186},"  domain: process.env.",[59,2692,208],{"class":83},[59,2694,662],{"class":179},[59,2696,211],{"class":186},[59,2698,2699,2702,2704,2706],{"class":61,"line":488},[59,2700,2701],{"class":186},"  clientId: process.env.",[59,2703,220],{"class":83},[59,2705,662],{"class":179},[59,2707,211],{"class":186},[59,2709,2710,2713,2715,2717],{"class":61,"line":500},[59,2711,2712],{"class":186},"  clientSecret: process.env.",[59,2714,231],{"class":83},[59,2716,662],{"class":179},[59,2718,211],{"class":186},[59,2720,2721],{"class":61,"line":510},[59,2722,245],{"class":186},[44,2724,2726],{"id":2725},"_3-エラーハンドリング","3. エラーハンドリング",[49,2728,2730],{"className":164,"code":2729,"language":166,"meta":54,"style":54},"try {\n  await this.auth0Service.createUser(input)\n} catch (error) {\n  if (error.message.includes('already exists')) {\n    \u002F\u002F ユーザーが既に存在する場合の処理\n    throw new ConflictException('User already exists')\n  }\n  throw error\n}\n",[56,2731,2732,2739,2752,2760,2779,2784,2799,2803,2811],{"__ignoreMap":54},[59,2733,2734,2737],{"class":61,"line":62},[59,2735,2736],{"class":179},"try",[59,2738,445],{"class":186},[59,2740,2741,2744,2746,2748,2750],{"class":61,"line":76},[59,2742,2743],{"class":179},"  await",[59,2745,804],{"class":83},[59,2747,1686],{"class":186},[59,2749,810],{"class":65},[59,2751,2395],{"class":186},[59,2753,2754,2756,2758],{"class":61,"line":196},[59,2755,1497],{"class":186},[59,2757,945],{"class":179},[59,2759,948],{"class":186},[59,2761,2762,2765,2768,2771,2773,2776],{"class":61,"line":202},[59,2763,2764],{"class":179},"  if",[59,2766,2767],{"class":186}," (error.message.",[59,2769,2770],{"class":65},"includes",[59,2772,596],{"class":186},[59,2774,2775],{"class":69},"'already exists'",[59,2777,2778],{"class":186},")) {\n",[59,2780,2781],{"class":61,"line":214},[59,2782,2783],{"class":173},"    \u002F\u002F ユーザーが既に存在する場合の処理\n",[59,2785,2786,2788,2790,2793,2795,2797],{"class":61,"line":225},[59,2787,1396],{"class":179},[59,2789,624],{"class":179},[59,2791,2792],{"class":65}," ConflictException",[59,2794,596],{"class":186},[59,2796,1318],{"class":69},[59,2798,896],{"class":186},[59,2800,2801],{"class":61,"line":236},[59,2802,741],{"class":186},[59,2804,2805,2808],{"class":61,"line":242},[59,2806,2807],{"class":179},"  throw",[59,2809,2810],{"class":186}," error\n",[59,2812,2813],{"class":61,"line":369},[59,2814,481],{"class":186},[44,2816,2818],{"id":2817},"_4-レート制限","4. レート制限",[15,2820,2821],{},"Auth0 Management APIにはレート制限があります",[49,2823,2825],{"className":164,"code":2824,"language":166,"meta":54,"style":54},"import { Throttle } from '@nestjs\u002Fthrottler'\n\n@Controller('users')\nexport class UsersController {\n  @Throttle(10, 60) \u002F\u002F 60秒間に10リクエストまで\n  @Post()\n  async createUser(@Body() dto: CreateUserDto) {\n    return this.auth0Service.createUser(dto)\n  }\n}\n",[56,2826,2827,2839,2843,2855,2865,2887,2895,2915,2927,2931],{"__ignoreMap":54},[59,2828,2829,2831,2834,2836],{"class":61,"line":62},[59,2830,302],{"class":179},[59,2832,2833],{"class":186}," { Throttle } ",[59,2835,308],{"class":179},[59,2837,2838],{"class":69}," '@nestjs\u002Fthrottler'\n",[59,2840,2841],{"class":61,"line":76},[59,2842,341],{"emptyLinePlaceholder":340},[59,2844,2845,2847,2849,2851,2853],{"class":61,"line":196},[59,2846,346],{"class":186},[59,2848,1446],{"class":65},[59,2850,596],{"class":186},[59,2852,1605],{"class":69},[59,2854,896],{"class":186},[59,2856,2857,2859,2861,2863],{"class":61,"line":202},[59,2858,180],{"class":179},[59,2860,379],{"class":179},[59,2862,1616],{"class":65},[59,2864,445],{"class":186},[59,2866,2867,2869,2872,2874,2877,2879,2882,2884],{"class":61,"line":214},[59,2868,1647],{"class":186},[59,2870,2871],{"class":65},"Throttle",[59,2873,596],{"class":186},[59,2875,2876],{"class":83},"10",[59,2878,1088],{"class":186},[59,2880,2881],{"class":83},"60",[59,2883,1733],{"class":186},[59,2885,2886],{"class":173},"\u002F\u002F 60秒間に10リクエストまで\n",[59,2888,2889,2891,2893],{"class":61,"line":225},[59,2890,1647],{"class":186},[59,2892,1650],{"class":65},[59,2894,537],{"class":186},[59,2896,2897,2899,2901,2903,2905,2907,2909,2911,2913],{"class":61,"line":236},[59,2898,752],{"class":179},[59,2900,755],{"class":65},[59,2902,1661],{"class":186},[59,2904,1664],{"class":65},[59,2906,1667],{"class":186},[59,2908,1670],{"class":450},[59,2910,454],{"class":179},[59,2912,1525],{"class":65},[59,2914,610],{"class":186},[59,2916,2917,2919,2921,2923,2925],{"class":61,"line":242},[59,2918,1681],{"class":179},[59,2920,804],{"class":83},[59,2922,1686],{"class":186},[59,2924,810],{"class":65},[59,2926,1691],{"class":186},[59,2928,2929],{"class":61,"line":369},[59,2930,741],{"class":186},[59,2932,2933],{"class":61,"line":374},[59,2934,481],{"class":186},[10,2936,2937],{"id":2937},"テストの実装",[49,2939,2941],{"className":164,"code":2940,"language":166,"meta":54,"style":54},"import { Test, TestingModule } from '@nestjs\u002Ftesting'\nimport { ConfigService } from '@nestjs\u002Fconfig'\nimport { Auth0Service } from '.\u002Fauth0.service'\n\ndescribe('Auth0Service', () => {\n  let service: Auth0Service\n\n  const mockConfigService = {\n    get: jest.fn((key: string) => {\n      const config = {\n        'auth0.domain': 'test.auth0.com',\n        'auth0.clientId': 'test-client-id',\n        'auth0.clientSecret': 'test-secret',\n      }\n      return config[key]\n    }),\n  }\n\n  beforeEach(async () => {\n    const module: TestingModule = await Test.createTestingModule({\n      providers: [\n        Auth0Service,\n        {\n          provide: ConfigService,\n          useValue: mockConfigService,\n        },\n      ],\n    }).compile()\n\n    service = module.get\u003CAuth0Service>(Auth0Service)\n  })\n\n  it('should be defined', () => {\n    expect(service).toBeDefined()\n  })\n\n  \u002F\u002F 実際のAuth0 APIを呼ばないモックテストを実装\n})\n",[56,2942,2943,2955,2965,2975,2979,2996,3009,3013,3025,3049,3060,3072,3084,3096,3100,3107,3112,3116,3120,3136,3160,3165,3170,3175,3180,3185,3190,3195,3205,3209,3230,3235,3239,3255,3268,3272,3276,3281],{"__ignoreMap":54},[59,2944,2945,2947,2950,2952],{"class":61,"line":62},[59,2946,302],{"class":179},[59,2948,2949],{"class":186}," { Test, TestingModule } ",[59,2951,308],{"class":179},[59,2953,2954],{"class":69}," '@nestjs\u002Ftesting'\n",[59,2956,2957,2959,2961,2963],{"class":61,"line":76},[59,2958,302],{"class":179},[59,2960,412],{"class":186},[59,2962,308],{"class":179},[59,2964,323],{"class":69},[59,2966,2967,2969,2971,2973],{"class":61,"line":196},[59,2968,302],{"class":179},[59,2970,330],{"class":186},[59,2972,308],{"class":179},[59,2974,335],{"class":69},[59,2976,2977],{"class":61,"line":202},[59,2978,341],{"emptyLinePlaceholder":340},[59,2980,2981,2984,2986,2989,2992,2994],{"class":61,"line":214},[59,2982,2983],{"class":65},"describe",[59,2985,596],{"class":186},[59,2987,2988],{"class":69},"'Auth0Service'",[59,2990,2991],{"class":186},", () ",[59,2993,190],{"class":179},[59,2995,445],{"class":186},[59,2997,2998,3001,3004,3006],{"class":61,"line":225},[59,2999,3000],{"class":179},"  let",[59,3002,3003],{"class":186}," service",[59,3005,454],{"class":179},[59,3007,3008],{"class":65}," Auth0Service\n",[59,3010,3011],{"class":61,"line":236},[59,3012,341],{"emptyLinePlaceholder":340},[59,3014,3015,3018,3021,3023],{"class":61,"line":242},[59,3016,3017],{"class":179},"  const",[59,3019,3020],{"class":83}," mockConfigService",[59,3022,579],{"class":179},[59,3024,445],{"class":186},[59,3026,3027,3030,3033,3036,3039,3041,3043,3045,3047],{"class":61,"line":369},[59,3028,3029],{"class":186},"    get: jest.",[59,3031,3032],{"class":65},"fn",[59,3034,3035],{"class":186},"((",[59,3037,3038],{"class":450},"key",[59,3040,454],{"class":179},[59,3042,997],{"class":83},[59,3044,1733],{"class":186},[59,3046,190],{"class":179},[59,3048,445],{"class":186},[59,3050,3051,3053,3056,3058],{"class":61,"line":374},[59,3052,793],{"class":179},[59,3054,3055],{"class":83}," config",[59,3057,579],{"class":179},[59,3059,445],{"class":186},[59,3061,3062,3065,3067,3070],{"class":61,"line":488},[59,3063,3064],{"class":69},"        'auth0.domain'",[59,3066,106],{"class":186},[59,3068,3069],{"class":69},"'test.auth0.com'",[59,3071,211],{"class":186},[59,3073,3074,3077,3079,3082],{"class":61,"line":500},[59,3075,3076],{"class":69},"        'auth0.clientId'",[59,3078,106],{"class":186},[59,3080,3081],{"class":69},"'test-client-id'",[59,3083,211],{"class":186},[59,3085,3086,3089,3091,3094],{"class":61,"line":510},[59,3087,3088],{"class":69},"        'auth0.clientSecret'",[59,3090,106],{"class":186},[59,3092,3093],{"class":69},"'test-secret'",[59,3095,211],{"class":186},[59,3097,3098],{"class":61,"line":519},[59,3099,902],{"class":186},[59,3101,3102,3104],{"class":61,"line":524},[59,3103,913],{"class":179},[59,3105,3106],{"class":186}," config[key]\n",[59,3108,3109],{"class":61,"line":529},[59,3110,3111],{"class":186},"    }),\n",[59,3113,3114],{"class":61,"line":540},[59,3115,741],{"class":186},[59,3117,3118],{"class":61,"line":552},[59,3119,341],{"emptyLinePlaceholder":340},[59,3121,3122,3125,3127,3130,3132,3134],{"class":61,"line":569},[59,3123,3124],{"class":65},"  beforeEach",[59,3126,596],{"class":186},[59,3128,3129],{"class":179},"async",[59,3131,187],{"class":186},[59,3133,190],{"class":179},[59,3135,445],{"class":186},[59,3137,3138,3140,3143,3145,3148,3150,3152,3155,3158],{"class":61,"line":585},[59,3139,2446],{"class":179},[59,3141,3142],{"class":83}," module",[59,3144,454],{"class":179},[59,3146,3147],{"class":65}," TestingModule",[59,3149,579],{"class":179},[59,3151,801],{"class":179},[59,3153,3154],{"class":186}," Test.",[59,3156,3157],{"class":65},"createTestingModule",[59,3159,351],{"class":186},[59,3161,3162],{"class":61,"line":590},[59,3163,3164],{"class":186},"      providers: [\n",[59,3166,3167],{"class":61,"line":613},[59,3168,3169],{"class":186},"        Auth0Service,\n",[59,3171,3172],{"class":61,"line":632},[59,3173,3174],{"class":186},"        {\n",[59,3176,3177],{"class":61,"line":667},[59,3178,3179],{"class":186},"          provide: ConfigService,\n",[59,3181,3182],{"class":61,"line":694},[59,3183,3184],{"class":186},"          useValue: mockConfigService,\n",[59,3186,3187],{"class":61,"line":721},[59,3188,3189],{"class":186},"        },\n",[59,3191,3192],{"class":61,"line":732},[59,3193,3194],{"class":186},"      ],\n",[59,3196,3197,3200,3203],{"class":61,"line":738},[59,3198,3199],{"class":186},"    }).",[59,3201,3202],{"class":65},"compile",[59,3204,537],{"class":186},[59,3206,3207],{"class":61,"line":744},[59,3208,341],{"emptyLinePlaceholder":340},[59,3210,3211,3214,3216,3218,3220,3222,3224,3227],{"class":61,"line":749},[59,3212,3213],{"class":186},"    service ",[59,3215,262],{"class":179},[59,3217,3142],{"class":83},[59,3219,957],{"class":186},[59,3221,644],{"class":65},[59,3223,647],{"class":186},[59,3225,3226],{"class":65},"Auth0Service",[59,3228,3229],{"class":186},">(Auth0Service)\n",[59,3231,3232],{"class":61,"line":782},[59,3233,3234],{"class":186},"  })\n",[59,3236,3237],{"class":61,"line":790},[59,3238,341],{"emptyLinePlaceholder":340},[59,3240,3241,3244,3246,3249,3251,3253],{"class":61,"line":815},[59,3242,3243],{"class":65},"  it",[59,3245,596],{"class":186},[59,3247,3248],{"class":69},"'should be defined'",[59,3250,2991],{"class":186},[59,3252,190],{"class":179},[59,3254,445],{"class":186},[59,3256,3257,3260,3263,3266],{"class":61,"line":826},[59,3258,3259],{"class":65},"    expect",[59,3261,3262],{"class":186},"(service).",[59,3264,3265],{"class":65},"toBeDefined",[59,3267,537],{"class":186},[59,3269,3270],{"class":61,"line":832},[59,3271,3234],{"class":186},[59,3273,3274],{"class":61,"line":838},[59,3275,341],{"emptyLinePlaceholder":340},[59,3277,3278],{"class":61,"line":844},[59,3279,3280],{"class":173},"  \u002F\u002F 実際のAuth0 APIを呼ばないモックテストを実装\n",[59,3282,3283],{"class":61,"line":855},[59,3284,245],{"class":186},[10,3286,3287],{"id":3287},"まとめ",[15,3289,3290],{},"Auth0 Management APIをNestJSで使うには：",[25,3292,3293,3299,3305,3311,3317],{},[28,3294,3295,3298],{},[21,3296,3297],{},"認証情報の管理",": 環境変数で安全に管理",[28,3300,3301,3304],{},[21,3302,3303],{},"エラーハンドリング",": 適切なエラー処理とユーザーフィードバック",[28,3306,3307,3310],{},[21,3308,3309],{},"セキュリティ",": パスワードポリシーとレート制限を実装",[28,3312,3313,3316],{},[21,3314,3315],{},"バリデーション",": DTOでの入力検証",[28,3318,3319,3322],{},[21,3320,3321],{},"テスト",": モックを使った単体テスト",[15,3324,3325],{},"REST APIとGraphQL両方で実装できるため、プロジェクトに応じて選択できます。",[44,3327,3328],{"id":3328},"参考リンク",[25,3330,3331,3340,3347],{},[28,3332,3333],{},[3334,3335,3339],"a",{"href":3336,"rel":3337},"https:\u002F\u002Fauth0.com\u002Fdocs\u002Fapi\u002Fmanagement\u002Fv2",[3338],"nofollow","Auth0 Management API",[28,3341,3342],{},[3334,3343,3346],{"href":3344,"rel":3345},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fauth0",[3338],"auth0 npm package",[28,3348,3349],{},[3334,3350,3353],{"href":3351,"rel":3352},"https:\u002F\u002Fdocs.nestjs.com\u002Ftechniques\u002Fconfiguration",[3338],"NestJS Configuration",[3355,3356,3357],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":54,"searchDepth":76,"depth":76,"links":3359},[3360,3361,3366,3370,3374,3379,3385,3386],{"id":12,"depth":76,"text":13},{"id":42,"depth":76,"text":42,"children":3362},[3363,3364,3365],{"id":46,"depth":196,"text":47},{"id":90,"depth":196,"text":91},{"id":124,"depth":196,"text":125},{"id":157,"depth":76,"text":158,"children":3367},[3368,3369],{"id":161,"depth":196,"text":161},{"id":286,"depth":196,"text":287},{"id":1441,"depth":76,"text":1442,"children":3371},[3372,3373],{"id":1445,"depth":196,"text":1446},{"id":1921,"depth":196,"text":1922},{"id":2058,"depth":76,"text":2059,"children":3375},[3376,3377,3378],{"id":2062,"depth":196,"text":2063},{"id":2237,"depth":196,"text":2238},{"id":2486,"depth":196,"text":2487},{"id":2581,"depth":76,"text":2581,"children":3380},[3381,3382,3383,3384],{"id":2584,"depth":196,"text":2585},{"id":2602,"depth":196,"text":2603},{"id":2725,"depth":196,"text":2726},{"id":2817,"depth":196,"text":2818},{"id":2937,"depth":76,"text":2937},{"id":3287,"depth":76,"text":3287,"children":3387},[3388],{"id":3328,"depth":196,"text":3328},"2022-10-12","Auth0のManagement APIとNestJSを使って、プログラムからAuth0にユーザーを登録する方法を解説します。REST APIとGraphQL両方の実装例を紹介します。","md",{"tags":3393},[3394,3395,3396],"nestjs","auth0","user-management","\u002Fblog\u002Fnestjs-auth0-user-registration",{"title":5,"description":3390},"blog\u002Fnestjs-auth0-user-registration","S01rhZt87YAVglfYCFgaJIkjL4mxYO1Z5K58QkBxUdE",1773664053967]