@things-factory/auth-google 6.1.186 → 6.1.188

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,11 +15,11 @@ async function syncAllUserInfo(authProvider, context) {
15
15
  Authorization: `Bearer ${accessToken}`
16
16
  }
17
17
  }).then(res => res.json());
18
- latestData.value
19
- .filter(({ mail }) => mail)
20
- .forEach(async (user) => {
21
- await updateUserInfo(authProvider, user, context);
22
- });
18
+ for (const user of latestData.value) {
19
+ if (user.mail) {
20
+ await updateUserInfo(authProvider, user, context);
21
+ }
22
+ }
23
23
  }
24
24
  exports.syncAllUserInfo = syncAllUserInfo;
25
25
  async function updateUserInfo(authProvider, userInfo, context) {
@@ -1 +1 @@
1
- {"version":3,"file":"sync-user-info.js","sourceRoot":"","sources":["../../server/controllers/sync-user-info.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch'\n\nimport { AuthProvider, User, UserStatus, UsersAuthProviders } from '@things-factory/auth-base'\nimport { getAccessToken } from './get-access-token'\n\nexport async function syncAllUserInfo(authProvider: AuthProvider, context: ResolverContext) {\n const accessToken = await getAccessToken(authProvider)\n\n if (!accessToken) {\n throw new Error('Failed to obtain access token')\n }\n\n const latestData = await fetch('https://graph.microsoft.com/v1.0/users', {\n headers: {\n Authorization: `Bearer ${accessToken}`\n }\n }).then(res => res.json())\n\n latestData.value\n .filter(({ mail }) => mail)\n .forEach(async user => {\n await updateUserInfo(authProvider, user, context)\n })\n}\n\nexport async function updateUserInfo(authProvider: AuthProvider, userInfo, context: ResolverContext) {\n const { tx, domain, user } = context.state\n\n // {\n // \"id\": \"d290f1ee-6c54-4b01-90e6-d701748f0851\",\n // \"businessPhones\": [\n // \"+1 412 555 0109\"\n // ],\n // \"displayName\": \"John Doe\",\n // \"givenName\": \"John\",\n // \"jobTitle\": \"Developer\",\n // \"mail\": \"john.doe@contoso.com\",\n // \"mobilePhone\": \"+1 412 555 0109\",\n // \"officeLocation\": \"Floor 2\",\n // \"preferredLanguage\": \"en-US\",\n // \"surname\": \"Doe\",\n // \"userPrincipalName\": \"john.doe@contoso.com\"\n // }\n const {\n id,\n businessPhones,\n displayName,\n givenName,\n surname,\n jobTitle,\n mail,\n mobilePhone,\n officeLocation,\n preferredLanguage,\n userPricipalName\n } = userInfo\n\n const repository = tx.getRepository(User)\n\n // 1. 사용자를 찾는다.(email 정보로)\n const existingUser = await repository.findOne({\n where: { email: mail },\n relations: ['domains']\n })\n\n if (!existingUser) {\n // 2. 사용자가 없다면, 생성한다.\n const salt = User.generateSalt()\n\n /* normally they don't login with this password. */\n const password = salt\n\n const createdUser = await repository.save({\n id,\n name: displayName,\n email: mail,\n creator: user,\n updater: user,\n domains: domain ? [domain] : [],\n roles: [],\n salt,\n userType: 'user',\n // ssoId: id,\n locale: preferredLanguage,\n status: UserStatus.ACTIVATED,\n passwordUpdatedAt: new Date(),\n password: User.encode(password, salt)\n })\n\n await tx.getRepository(UsersAuthProviders).save({\n domain,\n user: createdUser,\n authProvider,\n ssoId: id\n })\n\n return createdUser\n } else {\n // 3. 사용자가 있다면, 업데이트한다.\n const { domains } = existingUser\n\n if (!domains.find(existing => existing.id == domain.id)) {\n domains.push(domain)\n }\n\n const updatedUser = await repository.save({\n ...existingUser,\n name: displayName,\n // ssoId: id,\n domains,\n locale: preferredLanguage,\n updater: user\n })\n\n const usersAuthProviders = await tx.getRepository(UsersAuthProviders).findOne({\n where: { domain: { id: domain.id }, user: { id: updatedUser.id }, authProvider: { id: authProvider.id } }\n })\n\n await tx.getRepository(UsersAuthProviders).save({\n ...usersAuthProviders,\n domain,\n user: updatedUser,\n authProvider,\n ssoId: id\n })\n\n return updatedUser\n }\n}\n"]}
1
+ {"version":3,"file":"sync-user-info.js","sourceRoot":"","sources":["../../server/controllers/sync-user-info.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch'\n\nimport { AuthProvider, User, UserStatus, UsersAuthProviders } from '@things-factory/auth-base'\nimport { getAccessToken } from './get-access-token'\n\nexport async function syncAllUserInfo(authProvider: AuthProvider, context: ResolverContext) {\n const accessToken = await getAccessToken(authProvider)\n\n if (!accessToken) {\n throw new Error('Failed to obtain access token')\n }\n\n const latestData = await fetch('https://graph.microsoft.com/v1.0/users', {\n headers: {\n Authorization: `Bearer ${accessToken}`\n }\n }).then(res => res.json())\n\n for (const user of latestData.value) {\n if (user.mail) {\n await updateUserInfo(authProvider, user, context)\n }\n }\n}\n\nexport async function updateUserInfo(authProvider: AuthProvider, userInfo, context: ResolverContext) {\n const { tx, domain, user } = context.state\n\n // {\n // \"id\": \"d290f1ee-6c54-4b01-90e6-d701748f0851\",\n // \"businessPhones\": [\n // \"+1 412 555 0109\"\n // ],\n // \"displayName\": \"John Doe\",\n // \"givenName\": \"John\",\n // \"jobTitle\": \"Developer\",\n // \"mail\": \"john.doe@contoso.com\",\n // \"mobilePhone\": \"+1 412 555 0109\",\n // \"officeLocation\": \"Floor 2\",\n // \"preferredLanguage\": \"en-US\",\n // \"surname\": \"Doe\",\n // \"userPrincipalName\": \"john.doe@contoso.com\"\n // }\n const {\n id,\n businessPhones,\n displayName,\n givenName,\n surname,\n jobTitle,\n mail,\n mobilePhone,\n officeLocation,\n preferredLanguage,\n userPricipalName\n } = userInfo\n\n const repository = tx.getRepository(User)\n\n // 1. 사용자를 찾는다.(email 정보로)\n const existingUser = await repository.findOne({\n where: { email: mail },\n relations: ['domains']\n })\n\n if (!existingUser) {\n // 2. 사용자가 없다면, 생성한다.\n const salt = User.generateSalt()\n\n /* normally they don't login with this password. */\n const password = salt\n\n const createdUser = await repository.save({\n id,\n name: displayName,\n email: mail,\n creator: user,\n updater: user,\n domains: domain ? [domain] : [],\n roles: [],\n salt,\n userType: 'user',\n // ssoId: id,\n locale: preferredLanguage,\n status: UserStatus.ACTIVATED,\n passwordUpdatedAt: new Date(),\n password: User.encode(password, salt)\n })\n\n await tx.getRepository(UsersAuthProviders).save({\n domain,\n user: createdUser,\n authProvider,\n ssoId: id\n })\n\n return createdUser\n } else {\n // 3. 사용자가 있다면, 업데이트한다.\n const { domains } = existingUser\n\n if (!domains.find(existing => existing.id == domain.id)) {\n domains.push(domain)\n }\n\n const updatedUser = await repository.save({\n ...existingUser,\n name: displayName,\n // ssoId: id,\n domains,\n locale: preferredLanguage,\n updater: user\n })\n\n const usersAuthProviders = await tx.getRepository(UsersAuthProviders).findOne({\n where: { domain: { id: domain.id }, user: { id: updatedUser.id }, authProvider: { id: authProvider.id } }\n })\n\n await tx.getRepository(UsersAuthProviders).save({\n ...usersAuthProviders,\n domain,\n user: updatedUser,\n authProvider,\n ssoId: id\n })\n\n return updatedUser\n }\n}\n"]}
@@ -8,12 +8,14 @@ const env_1 = require("@things-factory/env");
8
8
  const auth_base_1 = require("@things-factory/auth-base");
9
9
  const SSOGoogleConfig = env_1.config.get('sso/google/config');
10
10
  if (SSOGoogleConfig) {
11
- koa_passport_1.default.use(new passport_google_oauth20_1.Strategy(SSOGoogleConfig, async (token, tokenSecret, profile, done) => {
11
+ koa_passport_1.default.use(new passport_google_oauth20_1.Strategy(Object.assign(Object.assign({}, SSOGoogleConfig), { scope: ['profile', 'https://www.googleapis.com/auth/userinfo.email'] }), async (token, tokenSecret, profile, done) => {
12
12
  if (!profile) {
13
13
  return done(new Error('No profile found'), null);
14
14
  }
15
15
  try {
16
- const { email } = profile;
16
+ const { emails, photos } = profile;
17
+ const email = emails === null || emails === void 0 ? void 0 : emails[0].value;
18
+ const photo = photos === null || photos === void 0 ? void 0 : photos[0].value;
17
19
  const user = await auth_base_1.User.checkAuthWithEmail({ email });
18
20
  const { id, userType, status } = user;
19
21
  return done(null, {
@@ -1 +1 @@
1
- {"version":3,"file":"google-authenticate-middleware.js","sourceRoot":"","sources":["../../server/middlewares/google-authenticate-middleware.ts"],"names":[],"mappings":";;;;AAAA,wEAAmC;AACnC,qEAAoE;AAEpE,6CAA4C;AAC5C,yDAAgD;AAEhD,MAAM,eAAe,GAAG,YAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEvD,IAAI,eAAe,EAAE;IACnB,sBAAQ,CAAC,GAAG,CACV,IAAI,kCAAc,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC9E,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAA;SACjD;QAED,IAAI;YACF,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;YAEzB,MAAM,IAAI,GAAG,MAAM,gBAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAErD,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;YAErC,OAAO,IAAI,CAAC,IAAI,EAAE;gBAChB,EAAE;gBACF,QAAQ;gBACR,MAAM;aACP,CAAC,CAAA;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;SACnB;IACH,CAAC,CAAC,CACH,CAAA;CACF;AAEM,KAAK,UAAU,oBAAoB,CAAC,OAAO,EAAE,IAAI;IACtD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9B,IAAI,IAAI,EAAE;QACR,OAAO,MAAM,IAAI,EAAE,CAAA;KACpB;IAED,MAAM,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;QACpC,eAAe,EAAE,cAAc;QAC/B,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACnB,CAAC;AAZD,oDAYC;AAEM,KAAK,UAAU,4BAA4B,CAAC,OAAO,EAAE,IAAI;;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9B,IAAI,IAAI,EAAE;QACR,OAAO,MAAM,IAAI,EAAE,CAAA;KACpB;IAED,MAAM,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;QACpC,eAAe,EAAE,cAAc;QAC/B,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC,OAAO,CAAC,CAAA;IAEX,wCAAwC;IACxC,MAAM,cAAc,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAE,QAAQ,CAAA;IAChD,IAAI,cAAc,EAAE;QAClB,MAAM,UAAU,GAAG,MAAM,gBAAI,CAAC,SAAS,CAAC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,CAAA;QAC7D,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAA;KAChC;IAED,OAAO,MAAM,IAAI,EAAE,CAAA;AACrB,CAAC;AArBD,oEAqBC","sourcesContent":["import passport from 'koa-passport'\nimport { Strategy as GoogleStrategy } from 'passport-google-oauth20'\n\nimport { config } from '@things-factory/env'\nimport { User } from '@things-factory/auth-base'\n\nconst SSOGoogleConfig = config.get('sso/google/config')\n\nif (SSOGoogleConfig) {\n passport.use(\n new GoogleStrategy(SSOGoogleConfig, async (token, tokenSecret, profile, done) => {\n if (!profile) {\n return done(new Error('No profile found'), null)\n }\n\n try {\n const { email } = profile\n\n const user = await User.checkAuthWithEmail({ email })\n\n const { id, userType, status } = user\n\n return done(null, {\n id,\n userType,\n status\n })\n } catch (error) {\n return done(error)\n }\n })\n )\n}\n\nexport async function authGoogleMiddleware(context, next) {\n const { path } = context\n const { user } = context.state\n\n if (user) {\n return await next()\n }\n\n await passport.authenticate('google', {\n failureRedirect: '/auth/signin',\n successRedirect: '/auth/checkin'\n })(context, next)\n}\n\nexport async function googleSubscriptionMiddleware(context, next) {\n const { path } = context\n const { user } = context.state\n\n if (user) {\n return await next()\n }\n\n await passport.authenticate('google', {\n failureRedirect: '/auth/signin',\n successRedirect: '/auth/checkin'\n })(context)\n\n /* 다음은, websocket 에서 인증을 처리하기 위한 작업임. */\n const passportObject = context.session?.passport\n if (passportObject) {\n const userEntity = await User.checkAuth(passportObject?.user)\n context.state.user = userEntity\n }\n\n return await next()\n}\n"]}
1
+ {"version":3,"file":"google-authenticate-middleware.js","sourceRoot":"","sources":["../../server/middlewares/google-authenticate-middleware.ts"],"names":[],"mappings":";;;;AAAA,wEAAmC;AACnC,qEAAoE;AAEpE,6CAA4C;AAC5C,yDAAgD;AAEhD,MAAM,eAAe,GAAG,YAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEvD,IAAI,eAAe,EAAE;IACnB,sBAAQ,CAAC,GAAG,CACV,IAAI,kCAAc,iCAEX,eAAe,KAClB,KAAK,EAAE,CAAC,SAAS,EAAE,gDAAgD,CAAC,KAEtE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;QAC1C,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,CAAA;SACjD;QAED,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;YAClC,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,CAAC,EAAE,KAAK,CAAA;YAC/B,MAAM,KAAK,GAAG,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,CAAC,EAAE,KAAK,CAAA;YAE/B,MAAM,IAAI,GAAG,MAAM,gBAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAErD,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;YAErC,OAAO,IAAI,CAAC,IAAI,EAAE;gBAChB,EAAE;gBACF,QAAQ;gBACR,MAAM;aACP,CAAC,CAAA;SACH;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;SACnB;IACH,CAAC,CACF,CACF,CAAA;CACF;AAEM,KAAK,UAAU,oBAAoB,CAAC,OAAO,EAAE,IAAI;IACtD,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9B,IAAI,IAAI,EAAE;QACR,OAAO,MAAM,IAAI,EAAE,CAAA;KACpB;IAED,MAAM,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;QACpC,eAAe,EAAE,cAAc;QAC/B,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AACnB,CAAC;AAZD,oDAYC;AAEM,KAAK,UAAU,4BAA4B,CAAC,OAAO,EAAE,IAAI;;IAC9D,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAE9B,IAAI,IAAI,EAAE;QACR,OAAO,MAAM,IAAI,EAAE,CAAA;KACpB;IAED,MAAM,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;QACpC,eAAe,EAAE,cAAc;QAC/B,eAAe,EAAE,eAAe;KACjC,CAAC,CAAC,OAAO,CAAC,CAAA;IAEX,wCAAwC;IACxC,MAAM,cAAc,GAAG,MAAA,OAAO,CAAC,OAAO,0CAAE,QAAQ,CAAA;IAChD,IAAI,cAAc,EAAE;QAClB,MAAM,UAAU,GAAG,MAAM,gBAAI,CAAC,SAAS,CAAC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,IAAI,CAAC,CAAA;QAC7D,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAA;KAChC;IAED,OAAO,MAAM,IAAI,EAAE,CAAA;AACrB,CAAC;AArBD,oEAqBC","sourcesContent":["import passport from 'koa-passport'\nimport { Strategy as GoogleStrategy } from 'passport-google-oauth20'\n\nimport { config } from '@things-factory/env'\nimport { User } from '@things-factory/auth-base'\n\nconst SSOGoogleConfig = config.get('sso/google/config')\n\nif (SSOGoogleConfig) {\n passport.use(\n new GoogleStrategy(\n {\n ...SSOGoogleConfig,\n scope: ['profile', 'https://www.googleapis.com/auth/userinfo.email']\n },\n async (token, tokenSecret, profile, done) => {\n if (!profile) {\n return done(new Error('No profile found'), null)\n }\n\n try {\n const { emails, photos } = profile\n const email = emails?.[0].value\n const photo = photos?.[0].value\n\n const user = await User.checkAuthWithEmail({ email })\n\n const { id, userType, status } = user\n\n return done(null, {\n id,\n userType,\n status\n })\n } catch (error) {\n return done(error)\n }\n }\n )\n )\n}\n\nexport async function authGoogleMiddleware(context, next) {\n const { path } = context\n const { user } = context.state\n\n if (user) {\n return await next()\n }\n\n await passport.authenticate('google', {\n failureRedirect: '/auth/signin',\n successRedirect: '/auth/checkin'\n })(context, next)\n}\n\nexport async function googleSubscriptionMiddleware(context, next) {\n const { path } = context\n const { user } = context.state\n\n if (user) {\n return await next()\n }\n\n await passport.authenticate('google', {\n failureRedirect: '/auth/signin',\n successRedirect: '/auth/checkin'\n })(context)\n\n /* 다음은, websocket 에서 인증을 처리하기 위한 작업임. */\n const passportObject = context.session?.passport\n if (passportObject) {\n const userEntity = await User.checkAuth(passportObject?.user)\n context.state.user = userEntity\n }\n\n return await next()\n}\n"]}
@@ -16,7 +16,7 @@ if (SSOGoogleConfig) {
16
16
  });
17
17
  process.on('bootstrap-module-global-public-route', (app, globalPublicRouter) => {
18
18
  globalPublicRouter.get('/auth/signin-with-google', koa_passport_1.default.authenticate('google', {
19
- scope: ['https://www.googleapis.com/auth/plus.login']
19
+ scope: ['profile', 'https://www.googleapis.com/auth/userinfo.email']
20
20
  }));
21
21
  });
22
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;;AAAA,wEAAmC;AACnC,6CAA4C;AAG5C,MAAM,eAAe,GAAG,YAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEvD,+CAAoD;AACpD,qCAAoE;AAEpE,IAAI,eAAe,EAAE;IACnB,OAAO,CAAC,EAAE,CAAC,kCAAyC,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE;QAC1E,cAAc,CAAC,IAAI,CAAC,kCAAoB,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE;QACpF,kBAAkB,CAAC,GAAG,CAAC,yBAAgB,CAAC,MAAM,EAAE,EAAE,yBAAgB,CAAC,cAAc,EAAE,CAAC,CAAA;QACpF,kBAAkB,CAAC,GAAG,CAAC,gCAAuB,CAAC,MAAM,EAAE,EAAE,gCAAuB,CAAC,cAAc,EAAE,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE;QACpF,kBAAkB,CAAC,GAAG,CACpB,0BAA0B,EAC1B,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B,KAAK,EAAE,CAAC,4CAA4C,CAAC;SACtD,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;CACH","sourcesContent":["import passport from 'koa-passport'\nimport { config } from '@things-factory/env'\nimport { setAccessTokenCookie } from '@things-factory/auth-base'\n\nconst SSOGoogleConfig = config.get('sso/google/config')\n\nimport { authGoogleMiddleware } from './middlewares'\nimport { authGoogleRouter, authGoogleWebhookRouter } from './router'\n\nif (SSOGoogleConfig) {\n process.on('bootstrap-collect-sso-middleware' as any, (_, ssoMiddlewares) => {\n ssoMiddlewares.push(authGoogleMiddleware)\n })\n\n process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n domainPublicRouter.use(authGoogleRouter.routes(), authGoogleRouter.allowedMethods())\n domainPublicRouter.use(authGoogleWebhookRouter.routes(), authGoogleWebhookRouter.allowedMethods())\n })\n\n process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n globalPublicRouter.get(\n '/auth/signin-with-google',\n passport.authenticate('google', {\n scope: ['https://www.googleapis.com/auth/plus.login']\n })\n )\n })\n}\n"]}
1
+ {"version":3,"file":"routes.js","sourceRoot":"","sources":["../server/routes.ts"],"names":[],"mappings":";;;AAAA,wEAAmC;AACnC,6CAA4C;AAG5C,MAAM,eAAe,GAAG,YAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAEvD,+CAAoD;AACpD,qCAAoE;AAEpE,IAAI,eAAe,EAAE;IACnB,OAAO,CAAC,EAAE,CAAC,kCAAyC,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE;QAC1E,cAAc,CAAC,IAAI,CAAC,kCAAoB,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE;QACpF,kBAAkB,CAAC,GAAG,CAAC,yBAAgB,CAAC,MAAM,EAAE,EAAE,yBAAgB,CAAC,cAAc,EAAE,CAAC,CAAA;QACpF,kBAAkB,CAAC,GAAG,CAAC,gCAAuB,CAAC,MAAM,EAAE,EAAE,gCAAuB,CAAC,cAAc,EAAE,CAAC,CAAA;IACpG,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,sCAA6C,EAAE,CAAC,GAAG,EAAE,kBAAkB,EAAE,EAAE;QACpF,kBAAkB,CAAC,GAAG,CACpB,0BAA0B,EAC1B,sBAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC9B,KAAK,EAAE,CAAC,SAAS,EAAE,gDAAgD,CAAC;SACrE,CAAC,CACH,CAAA;IACH,CAAC,CAAC,CAAA;CACH","sourcesContent":["import passport from 'koa-passport'\nimport { config } from '@things-factory/env'\nimport { setAccessTokenCookie } from '@things-factory/auth-base'\n\nconst SSOGoogleConfig = config.get('sso/google/config')\n\nimport { authGoogleMiddleware } from './middlewares'\nimport { authGoogleRouter, authGoogleWebhookRouter } from './router'\n\nif (SSOGoogleConfig) {\n process.on('bootstrap-collect-sso-middleware' as any, (_, ssoMiddlewares) => {\n ssoMiddlewares.push(authGoogleMiddleware)\n })\n\n process.on('bootstrap-module-domain-public-route' as any, (app, domainPublicRouter) => {\n domainPublicRouter.use(authGoogleRouter.routes(), authGoogleRouter.allowedMethods())\n domainPublicRouter.use(authGoogleWebhookRouter.routes(), authGoogleWebhookRouter.allowedMethods())\n })\n\n process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRouter) => {\n globalPublicRouter.get(\n '/auth/signin-with-google',\n passport.authenticate('google', {\n scope: ['profile', 'https://www.googleapis.com/auth/userinfo.email']\n })\n )\n })\n}\n"]}