diff --git a/packages/mesh/bigcommerce/src/application.ts b/packages/mesh/bigcommerce/src/application.ts index 4d50679f..ee3e1678 100644 --- a/packages/mesh/bigcommerce/src/application.ts +++ b/packages/mesh/bigcommerce/src/application.ts @@ -1,5 +1,6 @@ -import { createApplication } from 'graphql-modules'; -import { createBigCommerceModule } from '@aligent/bigcommerce-graphql-module'; +import { createApplication, Scope } from 'graphql-modules'; +import { createBigCommerceModule, ClientLoginService } from '@aligent/bigcommerce-graphql-module'; +import { createAuthModule, LoginService } from '@aligent/auth-module'; export default createApplication({ modules: [ @@ -11,5 +12,22 @@ export default createApplication({ clientId: process.env.BC_CLIENT_ID as string, storeHash: process.env.STORE_HASH as string, }), + createAuthModule({ + dynamoDbRegion: process.env.DYNAMO_DB__REGION as string, + dynamoDbAuthTable: process.env.DYNAMO_DB_AUTH_TABLE as string, + extendRefreshTokenExpiryInMinutes: 43200 | (30 * 24 * 60), // The time in minutes an extended user session should end in - optional + nonExtendRefreshTokenExpiryInMinutes: 15, // The time in minutes a non-extended user session should end in - optional + accessTokenExpiryInMinutes: 10, // The time in minutes an access token is valid for - optional + }), ], + // This works when both Auth and BigCommerce modules don't define the loginServices in the + // there local providers. + // providers: [ + // { + // useClass: ClientLoginService, + // provide: LoginService, + // scope: Scope.Singleton, + // global: true, + // }, + // ], }); diff --git a/packages/modules/auth/src/resolvers/mutations/generate-customer-token.ts b/packages/modules/auth/src/resolvers/mutations/generate-customer-token.ts index 432a95c5..e9690c4a 100644 --- a/packages/modules/auth/src/resolvers/mutations/generate-customer-token.ts +++ b/packages/modules/auth/src/resolvers/mutations/generate-customer-token.ts @@ -6,7 +6,9 @@ import { LoginService } from '../../services/login-service'; export const generateCustomerTokenResolver = { resolve: async (_root, args, context, _info) => { const loginService = context.injector.get(LoginService); + console.dir('Auth before login Service'); const entityId = await loginService.login(args); + console.dir('Auth after login Service'); const isExtendedLogin = !!args?.remember_me; diff --git a/packages/modules/auth/src/services/index.ts b/packages/modules/auth/src/services/index.ts index 9963da8d..fc0532a7 100644 --- a/packages/modules/auth/src/services/index.ts +++ b/packages/modules/auth/src/services/index.ts @@ -2,6 +2,7 @@ import { Provider, Scope } from 'graphql-modules'; import { ModuleConfigToken } from '../providers'; import { AuthService } from './auth'; import { AuthTokenService } from './auth-tokens'; +import { LoginService } from './login-service'; export * from './auth'; export * from './auth-tokens'; export * from './login-service'; @@ -20,5 +21,10 @@ export const getServices = (): Array => { deps: [ModuleConfigToken], scope: Scope.Singleton, }, + { + useClass: LoginService, + provide: LoginService, + scope: Scope.Singleton, + }, ]; }; diff --git a/packages/modules/auth/src/services/login-service.ts b/packages/modules/auth/src/services/login-service.ts index 19528820..e6d0fe59 100644 --- a/packages/modules/auth/src/services/login-service.ts +++ b/packages/modules/auth/src/services/login-service.ts @@ -1,4 +1,4 @@ -import { Injectable } from 'graphql-modules'; +import { Injectable, Scope } from 'graphql-modules'; import { CustomerId } from '../types'; /** diff --git a/packages/modules/bigcommerce/release-notes.md b/packages/modules/bigcommerce/release-notes.md index 8aef6126..57b8ef85 100644 --- a/packages/modules/bigcommerce/release-notes.md +++ b/packages/modules/bigcommerce/release-notes.md @@ -1,5 +1,19 @@ # BigCommerce GraphQl Module Release Notes +## bigcommerce-graphql-module-1.0.8 + +#### Changes: + +- Updates the "generateMeshToken" function to return a "customer_id" property instead of "bc_customer_id". +Updates the "getBcCustomerIdFromMeshToken" function to look for a "customer_id" property instead of "bc_customer_id". +This is due to the Auth Module generating a JWT containing a "customer_id" property +but the BigCommerce Module decodes the JWT and looks for a "bc_customer_id" property. + +#### Tickets + +- MI-121: Auth module authentication issue + - https://aligent.atlassian.net/browse/MI-121 + ## bigcommerce-graphql-module-1.0.6 #### Changes: diff --git a/packages/modules/bigcommerce/src/index.ts b/packages/modules/bigcommerce/src/index.ts index 86107833..01b8e082 100644 --- a/packages/modules/bigcommerce/src/index.ts +++ b/packages/modules/bigcommerce/src/index.ts @@ -32,6 +32,7 @@ export * from './plugins/add-ip-address-to-axios-headers'; export * from './apis/graphql'; export * from './apis/rest'; export * from './utils'; +export * from './services'; // Export Globally accessible DI Tokens so other modules can use them export { ModuleConfig } from './providers'; diff --git a/packages/modules/bigcommerce/src/providers/index.ts b/packages/modules/bigcommerce/src/providers/index.ts index 020c19bc..e531c3ec 100644 --- a/packages/modules/bigcommerce/src/providers/index.ts +++ b/packages/modules/bigcommerce/src/providers/index.ts @@ -1,5 +1,5 @@ import { InjectionToken, Provider, Scope } from 'graphql-modules'; -import { BigCommerceModuleConfig } from '../index'; +import { BigCommerceModuleConfig, getServices } from '../index'; import { Get, Paths } from 'type-fest'; import { BigCommerceGraphQlClient } from '../clients'; @@ -38,5 +38,6 @@ export const getProviders = (config: BigCommerceModuleConfig): Array = global: true, }, BigCommerceGraphQlClient, + ...getServices(), ]; }; diff --git a/packages/modules/bigcommerce/src/services/index.ts b/packages/modules/bigcommerce/src/services/index.ts new file mode 100644 index 00000000..abed9a90 --- /dev/null +++ b/packages/modules/bigcommerce/src/services/index.ts @@ -0,0 +1,14 @@ +import { Provider } from 'graphql-modules'; +import { LoginService } from '@aligent/auth-module'; +import { ClientLoginService } from './login-service'; + +export * from './login-service'; + +export const getServices = (): Array => { + return [ + { + useClass: ClientLoginService, + provide: LoginService, + }, + ]; +}; diff --git a/packages/modules/bigcommerce/src/services/login-service.ts b/packages/modules/bigcommerce/src/services/login-service.ts new file mode 100644 index 00000000..18adab99 --- /dev/null +++ b/packages/modules/bigcommerce/src/services/login-service.ts @@ -0,0 +1,16 @@ +import { Injectable } from 'graphql-modules'; +import { CustomerId, LoginService } from '@aligent/auth-module'; + +@Injectable() +export class ClientLoginService extends LoginService { + constructor() { + super(); + } + + override async login(args: { email: string; password: string }): Promise { + console.dir('LoginService override is working'); + + // Implement your login logic here + return Promise.resolve(98); + } +} diff --git a/packages/modules/bigcommerce/src/types/index.ts b/packages/modules/bigcommerce/src/types/index.ts index 572cfc62..3a90cb4b 100644 --- a/packages/modules/bigcommerce/src/types/index.ts +++ b/packages/modules/bigcommerce/src/types/index.ts @@ -181,7 +181,7 @@ export interface DecodedCustomerImpersonationToken { } export interface MeshToken { - bc_customer_id: number; + customer_id: number; iat: number; exp: number; } diff --git a/packages/modules/bigcommerce/src/utils/tokens.ts b/packages/modules/bigcommerce/src/utils/tokens.ts index 75b1287d..bdf85853 100644 --- a/packages/modules/bigcommerce/src/utils/tokens.ts +++ b/packages/modules/bigcommerce/src/utils/tokens.ts @@ -24,7 +24,7 @@ export const getDecodedCustomerImpersonationToken = ( }; /** - * Attempts to extract "bc_customer_id" for the mesh token or throws an error + * Attempts to extract "customer_id" for the mesh token or throws an error * @param meshToken */ export const getBcCustomerIdFromMeshToken = (meshToken: string): number => { @@ -32,7 +32,7 @@ export const getBcCustomerIdFromMeshToken = (meshToken: string): number => { if (meshToken?.toLowerCase().startsWith('bearer')) { const splitMeshToken = meshToken.split(' ')[1]; const decodedMeshToken = verify(splitMeshToken, JWT_PRIVATE_KEY) as MeshToken; - return decodedMeshToken.bc_customer_id; + return decodedMeshToken.customer_id; } else { throw new Error(`Need to send Bearer token`); } @@ -48,13 +48,13 @@ export const getBcCustomerIdFromMeshToken = (meshToken: string): number => { }; /** - * Creates a token when a user logs in also stores the bc_customer_id in the payload + * Creates a token when a user logs in also stores the customer_id in the payload * which can be used for later request to the Mesh. * @param {number} entityId - Bc User Id returned from logging in */ export const generateMeshToken = (entityId: number): string => { const payload = { - bc_customer_id: entityId, + customer_id: entityId, exp: getUnixTimeStampInSecondsForMidnightTonight(), };