From 1adfbb27b9dd3c6414e20cbd299dbc1a34805dec Mon Sep 17 00:00:00 2001 From: Kevin He Date: Sun, 12 Mar 2023 22:26:47 -0700 Subject: [PATCH 1/9] add test --- .../commerce-sdk-react/src/auth/index.test.ts | 7 +++++ packages/commerce-sdk-react/src/auth/index.ts | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index b16faf33a1..b4fe13d632 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -196,6 +196,13 @@ describe('Auth', () => { expect(auth.queueRequest).not.toHaveBeenCalled() }) }) + test.only('ready - use `fetchedToken` and auth data is populated', async () => { + const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' + const auth = new Auth({...config, fetchedToken}) + await auth.ready().then(() => { + expect(auth.get('access_token')).toBe(fetchedToken) + }) + }) test('ready - use refresh token when access token is expired', async () => { const auth = new Auth(config) diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index ad38c783a7..02bc07a663 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -288,6 +288,7 @@ class Auth { */ async ready() { if (this.fetchedToken && this.fetchedToken !== '') { + this.pendingToken = Promise.resolve({...this.data, access_token: this.fetchedToken}) return this.pendingToken } @@ -405,6 +406,31 @@ class Auth { this.clearStorage() return this.loginGuestUser() } + + /** + * Decode SLAS JWT and extract information such as customer id, usid, etc. + * + */ + async decodeSlasJWT(jwt: string) { + const payload = jwtDecode(jwt) + const {sub, isb} + // { + // aut: 'GUID', + // scp: 'sfcc.shopper-myaccount.baskets sfcc.shopper-myaccount.addresses sfcc.shopper-products sfcc.shopper-discovery-search sfcc.shopper-myaccount.rw sfcc.shopper-myaccount.paymentinstruments sfcc.shopper-customers.login sfcc.shopper-experience sfcc.shopper-myaccount.orders sfcc.shopper-customers.register sfcc.shopper-baskets-orders sfcc.shopper-myaccount.addresses.rw sfcc.shopper-myaccount.productlists.rw sfcc.shopper-productlists sfcc.shopper-promotions sfcc.shopper-baskets-orders.rw sfcc.shopper-myaccount.paymentinstruments.rw sfcc.shopper-gift-certificates sfcc.shopper-product-search sfcc.shopper-myaccount.productlists sfcc.shopper-categories sfcc.shopper-myaccount', + // sub: 'cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-9971-40f88962b836::usid:b4865233-de92-4039-b944-aa2dfc8c1ea5', + // ctx: 'slas', + // iss: 'slas/prod/zzrf_001', + // ist: 1, + // aud: 'commercecloud/prod/zzrf_001', + // nbf: 1678681064, + // sty: 'User', + // isb: 'uido:ecom::upn:arayanavarro@salesforce.com::uidn:FirstName LastName::gcid:abwHo2lHsWkXkRxes3kGYYkbk3::rcid:abjbeMlITbrgoyAC6MdyGGR9C5::chid:RefArchGlobal', + // exp: 1678682894, + // iat: 1678681094, + // jti: 'C2C4856201860-18906789034652625635569919' + // } + console.error(jwtDecode(this.fetchedToken)) + } } export default Auth From 45f74e96d6fe21e40a5ffa73674ca370bd9e1982 Mon Sep 17 00:00:00 2001 From: Kevin He Date: Sun, 12 Mar 2023 23:02:41 -0700 Subject: [PATCH 2/9] decode jwt data --- .../commerce-sdk-react/src/auth/index.test.ts | 15 ++++- packages/commerce-sdk-react/src/auth/index.ts | 58 ++++++++++++------- 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index b4fe13d632..12467337fd 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -196,11 +196,24 @@ describe('Auth', () => { expect(auth.queueRequest).not.toHaveBeenCalled() }) }) - test.only('ready - use `fetchedToken` and auth data is populated', async () => { + test('ready - use `fetchedToken` and auth data is populated for registered user', async () => { const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' const auth = new Auth({...config, fetchedToken}) await auth.ready().then(() => { expect(auth.get('access_token')).toBe(fetchedToken) + expect(auth.get('customer_id')).toBe('abjbeMlITbrgoyAC6MdyGGR9C5') + expect(auth.get('usid')).toBe('b4865233-de92-4039-b944-aa2dfc8c1ea5') + expect(auth.get('customer_type')).toBe('registered') + }) + }) + test('ready - use `fetchedToken` and auth data is populated for guest user', async () => { + const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOjczN2ZiZDQwLWE2N2YtNDI4MS1iMjNmLTEyMzFlMzJmOWVlNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4NTk1OSwic3R5IjoiVXNlciIsImlzYiI6InVpZG86c2xhczo6dXBuOkd1ZXN0Ojp1aWRuOkd1ZXN0IFVzZXI6OmdjaWQ6YmNsWGsxeEtoSWxiYVJ3cncxeEdZWWtIRVY6OmNoaWQ6ICIsImV4cCI6MTY3ODY4Nzc4OSwiaWF0IjoxNjc4Njg1OTg5LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjU3NDI4MTYxMDQ3Njk4In0.WJUcC7rKHzOZ91ccmn95RXnhjmsFI1WWPyauQXtl-oDwD0OKiaQy1TLFmWrVVpZWgkJekQ-9w6AolqeEo5zWHA' + const auth = new Auth({...config, fetchedToken}) + await auth.ready().then(() => { + expect(auth.get('access_token')).toBe(fetchedToken) + expect(auth.get('customer_id')).toBe('bclXk1xKhIlbaRwrw1xGYYkHEV') + expect(auth.get('usid')).toBe('737fbd40-a67f-4281-b23f-1231e32f9ee5') + expect(auth.get('customer_type')).toBe('guest') }) }) test('ready - use refresh token when access token is expired', async () => { diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index 02bc07a663..c7290b8a6a 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -31,6 +31,22 @@ interface JWTHeaders { iat: number } +interface SlasJwtPayload { + aut: string + scp: string + sub: string + ctx: string + iss: string + ist: number + aud: string + nbf: number + sty: string + isb: string + exp: number + iat: number + jti: string + } + /** * The extended field is not from api response, we manually store the auth type, * so we don't need to make another API call when we already have the data. @@ -288,8 +304,12 @@ class Auth { */ async ready() { if (this.fetchedToken && this.fetchedToken !== '') { - - this.pendingToken = Promise.resolve({...this.data, access_token: this.fetchedToken}) + const {isGuest, customerId, usid} = this.decodeSlasJWT(this.fetchedToken) + this.set('access_token', this.fetchedToken) + this.set('customer_id', customerId) + this.set('usid', usid) + this.set('customer_type', isGuest ? 'guest' : 'registered') + this.pendingToken = Promise.resolve(this.data) return this.pendingToken } if (this.pendingToken) { @@ -411,25 +431,21 @@ class Auth { * Decode SLAS JWT and extract information such as customer id, usid, etc. * */ - async decodeSlasJWT(jwt: string) { - const payload = jwtDecode(jwt) - const {sub, isb} - // { - // aut: 'GUID', - // scp: 'sfcc.shopper-myaccount.baskets sfcc.shopper-myaccount.addresses sfcc.shopper-products sfcc.shopper-discovery-search sfcc.shopper-myaccount.rw sfcc.shopper-myaccount.paymentinstruments sfcc.shopper-customers.login sfcc.shopper-experience sfcc.shopper-myaccount.orders sfcc.shopper-customers.register sfcc.shopper-baskets-orders sfcc.shopper-myaccount.addresses.rw sfcc.shopper-myaccount.productlists.rw sfcc.shopper-productlists sfcc.shopper-promotions sfcc.shopper-baskets-orders.rw sfcc.shopper-myaccount.paymentinstruments.rw sfcc.shopper-gift-certificates sfcc.shopper-product-search sfcc.shopper-myaccount.productlists sfcc.shopper-categories sfcc.shopper-myaccount', - // sub: 'cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-9971-40f88962b836::usid:b4865233-de92-4039-b944-aa2dfc8c1ea5', - // ctx: 'slas', - // iss: 'slas/prod/zzrf_001', - // ist: 1, - // aud: 'commercecloud/prod/zzrf_001', - // nbf: 1678681064, - // sty: 'User', - // isb: 'uido:ecom::upn:arayanavarro@salesforce.com::uidn:FirstName LastName::gcid:abwHo2lHsWkXkRxes3kGYYkbk3::rcid:abjbeMlITbrgoyAC6MdyGGR9C5::chid:RefArchGlobal', - // exp: 1678682894, - // iat: 1678681094, - // jti: 'C2C4856201860-18906789034652625635569919' - // } - console.error(jwtDecode(this.fetchedToken)) + decodeSlasJWT(jwt: string) { + const payload = jwtDecode(jwt) as SlasJwtPayload + const {sub, isb} = payload + // ISB format + // 'uido:ecom::upn:Guest||xxxEmailxxx::uidn:FirstName LastName::gcid:xxxGuestCustomerIdxxx::rcid:xxxRegisteredCustomerIdxxx::chid:xxxSiteIdxxx', + const isGuest = isb.split('::')[1].replace('upn:', '') === 'Guest' + const customerId = isGuest ? isb.split('::')[3].replace('gcid:', '') : isb.split('::')[4].replace('rcid:', '') + // SUB format + // cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-xxxx-40f88962b836::usid:b4865233-de92-4039-xxxx-aa2dfc8c1ea5 + const usid = sub.split('::')[3].replace('usid:', '') + return { + isGuest, + customerId, + usid + } } } From 727588b81c3ea85e7e64b0d8f74e921bf498ade1 Mon Sep 17 00:00:00 2001 From: Kevin He Date: Sun, 12 Mar 2023 23:05:33 -0700 Subject: [PATCH 3/9] lint --- .../commerce-sdk-react/src/auth/index.test.ts | 6 ++-- packages/commerce-sdk-react/src/auth/index.ts | 32 ++++++++++--------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index 12467337fd..e1c5d495a2 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -197,7 +197,8 @@ describe('Auth', () => { }) }) test('ready - use `fetchedToken` and auth data is populated for registered user', async () => { - const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' + const fetchedToken = + 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' const auth = new Auth({...config, fetchedToken}) await auth.ready().then(() => { expect(auth.get('access_token')).toBe(fetchedToken) @@ -207,7 +208,8 @@ describe('Auth', () => { }) }) test('ready - use `fetchedToken` and auth data is populated for guest user', async () => { - const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOjczN2ZiZDQwLWE2N2YtNDI4MS1iMjNmLTEyMzFlMzJmOWVlNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4NTk1OSwic3R5IjoiVXNlciIsImlzYiI6InVpZG86c2xhczo6dXBuOkd1ZXN0Ojp1aWRuOkd1ZXN0IFVzZXI6OmdjaWQ6YmNsWGsxeEtoSWxiYVJ3cncxeEdZWWtIRVY6OmNoaWQ6ICIsImV4cCI6MTY3ODY4Nzc4OSwiaWF0IjoxNjc4Njg1OTg5LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjU3NDI4MTYxMDQ3Njk4In0.WJUcC7rKHzOZ91ccmn95RXnhjmsFI1WWPyauQXtl-oDwD0OKiaQy1TLFmWrVVpZWgkJekQ-9w6AolqeEo5zWHA' + const fetchedToken = + 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOjczN2ZiZDQwLWE2N2YtNDI4MS1iMjNmLTEyMzFlMzJmOWVlNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4NTk1OSwic3R5IjoiVXNlciIsImlzYiI6InVpZG86c2xhczo6dXBuOkd1ZXN0Ojp1aWRuOkd1ZXN0IFVzZXI6OmdjaWQ6YmNsWGsxeEtoSWxiYVJ3cncxeEdZWWtIRVY6OmNoaWQ6ICIsImV4cCI6MTY3ODY4Nzc4OSwiaWF0IjoxNjc4Njg1OTg5LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjU3NDI4MTYxMDQ3Njk4In0.WJUcC7rKHzOZ91ccmn95RXnhjmsFI1WWPyauQXtl-oDwD0OKiaQy1TLFmWrVVpZWgkJekQ-9w6AolqeEo5zWHA' const auth = new Auth({...config, fetchedToken}) await auth.ready().then(() => { expect(auth.get('access_token')).toBe(fetchedToken) diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index c7290b8a6a..c55f97fe17 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -32,20 +32,20 @@ interface JWTHeaders { } interface SlasJwtPayload { - aut: string - scp: string - sub: string - ctx: string - iss: string - ist: number - aud: string - nbf: number - sty: string - isb: string - exp: number - iat: number - jti: string - } + aut: string + scp: string + sub: string + ctx: string + iss: string + ist: number + aud: string + nbf: number + sty: string + isb: string + exp: number + iat: number + jti: string +} /** * The extended field is not from api response, we manually store the auth type, @@ -437,7 +437,9 @@ class Auth { // ISB format // 'uido:ecom::upn:Guest||xxxEmailxxx::uidn:FirstName LastName::gcid:xxxGuestCustomerIdxxx::rcid:xxxRegisteredCustomerIdxxx::chid:xxxSiteIdxxx', const isGuest = isb.split('::')[1].replace('upn:', '') === 'Guest' - const customerId = isGuest ? isb.split('::')[3].replace('gcid:', '') : isb.split('::')[4].replace('rcid:', '') + const customerId = isGuest + ? isb.split('::')[3].replace('gcid:', '') + : isb.split('::')[4].replace('rcid:', '') // SUB format // cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-xxxx-40f88962b836::usid:b4865233-de92-4039-xxxx-aa2dfc8c1ea5 const usid = sub.split('::')[3].replace('usid:', '') From 2b6d3d99ac02da5fc927ac90d555f5bb6878b23e Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 09:36:31 -0700 Subject: [PATCH 4/9] Update packages/commerce-sdk-react/src/auth/index.ts Co-authored-by: Will Harney <62956339+wjhsf@users.noreply.github.com> --- packages/commerce-sdk-react/src/auth/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index c55f97fe17..bcf8df4e01 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -436,10 +436,11 @@ class Auth { const {sub, isb} = payload // ISB format // 'uido:ecom::upn:Guest||xxxEmailxxx::uidn:FirstName LastName::gcid:xxxGuestCustomerIdxxx::rcid:xxxRegisteredCustomerIdxxx::chid:xxxSiteIdxxx', - const isGuest = isb.split('::')[1].replace('upn:', '') === 'Guest' + const isbParts = isb.split('::') + const isGuest = isbParts[1] === 'upn:Guest' const customerId = isGuest - ? isb.split('::')[3].replace('gcid:', '') - : isb.split('::')[4].replace('rcid:', '') + ? isbParts[3].replace('gcid:', '') + : isbParts[4].replace('rcid:', '') // SUB format // cc-slas::zzrf_001::scid:c9c45bfd-0ed3-4aa2-xxxx-40f88962b836::usid:b4865233-de92-4039-xxxx-aa2dfc8c1ea5 const usid = sub.split('::')[3].replace('usid:', '') From 83e62bed0fd3b0018799264137c60cf41dc1ff4f Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 09:37:18 -0700 Subject: [PATCH 5/9] rename parseSlasJWT --- packages/commerce-sdk-react/src/auth/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index c55f97fe17..0dfeee7427 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -304,7 +304,7 @@ class Auth { */ async ready() { if (this.fetchedToken && this.fetchedToken !== '') { - const {isGuest, customerId, usid} = this.decodeSlasJWT(this.fetchedToken) + const {isGuest, customerId, usid} = this.parseSlasJWT(this.fetchedToken) this.set('access_token', this.fetchedToken) this.set('customer_id', customerId) this.set('usid', usid) @@ -431,7 +431,7 @@ class Auth { * Decode SLAS JWT and extract information such as customer id, usid, etc. * */ - decodeSlasJWT(jwt: string) { + parseSlasJWT(jwt: string) { const payload = jwtDecode(jwt) as SlasJwtPayload const {sub, isb} = payload // ISB format From 2ea49147722e7f84af7761280ae52484fe4b226a Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 09:37:39 -0700 Subject: [PATCH 6/9] Update packages/commerce-sdk-react/src/auth/index.test.ts Co-authored-by: Will Harney <62956339+wjhsf@users.noreply.github.com> --- packages/commerce-sdk-react/src/auth/index.test.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index e1c5d495a2..18960d5238 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -200,12 +200,11 @@ describe('Auth', () => { const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' const auth = new Auth({...config, fetchedToken}) - await auth.ready().then(() => { - expect(auth.get('access_token')).toBe(fetchedToken) - expect(auth.get('customer_id')).toBe('abjbeMlITbrgoyAC6MdyGGR9C5') - expect(auth.get('usid')).toBe('b4865233-de92-4039-b944-aa2dfc8c1ea5') - expect(auth.get('customer_type')).toBe('registered') - }) + await auth.ready() + expect(auth.get('access_token')).toBe(fetchedToken) + expect(auth.get('customer_id')).toBe('abjbeMlITbrgoyAC6MdyGGR9C5') + expect(auth.get('usid')).toBe('b4865233-de92-4039-b944-aa2dfc8c1ea5') + expect(auth.get('customer_type')).toBe('registered') }) test('ready - use `fetchedToken` and auth data is populated for guest user', async () => { const fetchedToken = From 8a8f49b326aed7218c477b1ea08cf99d165c4364 Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 09:56:43 -0700 Subject: [PATCH 7/9] convert all .thens to await --- .../commerce-sdk-react/src/auth/index.test.ts | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index 18960d5238..6aff0a436e 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -192,9 +192,8 @@ describe('Auth', () => { test('ready - use `fetchedToken` and short circuit network request', async () => { const auth = new Auth({...config, fetchedToken: 'fake-token'}) jest.spyOn(auth, 'queueRequest') - await auth.ready().then(() => { - expect(auth.queueRequest).not.toHaveBeenCalled() - }) + await auth.ready() + expect(auth.queueRequest).not.toHaveBeenCalled() }) test('ready - use `fetchedToken` and auth data is populated for registered user', async () => { const fetchedToken = @@ -210,12 +209,11 @@ describe('Auth', () => { const fetchedToken = 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOjczN2ZiZDQwLWE2N2YtNDI4MS1iMjNmLTEyMzFlMzJmOWVlNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4NTk1OSwic3R5IjoiVXNlciIsImlzYiI6InVpZG86c2xhczo6dXBuOkd1ZXN0Ojp1aWRuOkd1ZXN0IFVzZXI6OmdjaWQ6YmNsWGsxeEtoSWxiYVJ3cncxeEdZWWtIRVY6OmNoaWQ6ICIsImV4cCI6MTY3ODY4Nzc4OSwiaWF0IjoxNjc4Njg1OTg5LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjU3NDI4MTYxMDQ3Njk4In0.WJUcC7rKHzOZ91ccmn95RXnhjmsFI1WWPyauQXtl-oDwD0OKiaQy1TLFmWrVVpZWgkJekQ-9w6AolqeEo5zWHA' const auth = new Auth({...config, fetchedToken}) - await auth.ready().then(() => { - expect(auth.get('access_token')).toBe(fetchedToken) - expect(auth.get('customer_id')).toBe('bclXk1xKhIlbaRwrw1xGYYkHEV') - expect(auth.get('usid')).toBe('737fbd40-a67f-4281-b23f-1231e32f9ee5') - expect(auth.get('customer_type')).toBe('guest') - }) + await auth.ready() + expect(auth.get('access_token')).toBe(fetchedToken) + expect(auth.get('customer_id')).toBe('bclXk1xKhIlbaRwrw1xGYYkHEV') + expect(auth.get('usid')).toBe('737fbd40-a67f-4281-b23f-1231e32f9ee5') + expect(auth.get('customer_type')).toBe('guest') }) test('ready - use refresh token when access token is expired', async () => { const auth = new Auth(config) @@ -241,34 +239,29 @@ describe('Auth', () => { auth.set(key, data[key]) }) - await auth.ready().then(() => { - expect(helpers.refreshAccessToken).toBeCalled() - }) + await auth.ready() + expect(helpers.refreshAccessToken).toBeCalled() }) test('ready - PKCE flow', async () => { const auth = new Auth(config) - await auth.ready().then(() => { - expect(helpers.loginGuestUser).toBeCalled() - }) + await auth.ready() + expect(helpers.loginGuestUser).toBeCalled() }) test('loginGuestUser', async () => { const auth = new Auth(config) - await auth.loginGuestUser().then(() => { - expect(helpers.loginGuestUser).toBeCalled() - }) + await auth.loginGuestUser() + expect(helpers.loginGuestUser).toBeCalled() }) test('loginRegisteredUserB2C', async () => { const auth = new Auth(config) - await auth.loginRegisteredUserB2C({username: 'test', password: 'test'}).then(() => { - expect(helpers.loginRegisteredUserB2C).toBeCalled() - }) + await auth.loginRegisteredUserB2C({username: 'test', password: 'test'}) + expect(helpers.loginRegisteredUserB2C).toBeCalled() }) test('logout', async () => { const auth = new Auth(config) - await auth.logout().then(() => { - expect(helpers.loginGuestUser).toBeCalled() - }) + await auth.logout() + expect(helpers.loginGuestUser).toBeCalled() }) test('running on the server uses a shared context memory store', async () => { const refreshTokenGuest = 'guest' From 17807b6f7ed51a44d11c57745d1ae5ff5c585679 Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 10:20:17 -0700 Subject: [PATCH 8/9] make fake token in tests more clear --- .../commerce-sdk-react/src/auth/index.test.ts | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index 6aff0a436e..47ebea9e2c 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -190,29 +190,42 @@ describe('Auth', () => { expect(auth.ready()).resolves.toEqual(result) }) test('ready - use `fetchedToken` and short circuit network request', async () => { - const auth = new Auth({...config, fetchedToken: 'fake-token'}) + const fetchedToken = jwt.sign({ + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:usid`, + isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:rcid::chid:siteId` + }, 'secret') + const auth = new Auth({...config, fetchedToken}) jest.spyOn(auth, 'queueRequest') await auth.ready() expect(auth.queueRequest).not.toHaveBeenCalled() }) test('ready - use `fetchedToken` and auth data is populated for registered user', async () => { - const fetchedToken = - 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOmI0ODY1MjMzLWRlOTItNDAzOS1iOTQ0LWFhMmRmYzhjMWVhNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4MTA2NCwic3R5IjoiVXNlciIsImlzYiI6InVpZG86ZWNvbTo6dXBuOmFyYXlhbmF2YXJyb0BzYWxlc2ZvcmNlLmNvbTo6dWlkbjpGaXJzdE5hbWUgTGFzdE5hbWU6OmdjaWQ6YWJ3SG8ybEhzV2tYa1J4ZXMza0dZWWtiazM6OnJjaWQ6YWJqYmVNbElUYnJnb3lBQzZNZHlHR1I5QzU6OmNoaWQ6UmVmQXJjaEdsb2JhbCIsImV4cCI6MTY3ODY4Mjg5NCwiaWF0IjoxNjc4NjgxMDk0LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjUyNjI1NjM1NTY5OTE5In0.WV-iEj55UQjHzJpDeHWIbKmznPolb6bLGbVvfyFGLvTMYT2Wn2sZU8jiZ9pTdIIr97zWyd-RWM4cm22NUkNyGA' + const usid = 'usidddddd' + const customerId = 'customerIddddddd' + const fetchedToken = jwt.sign({ + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, + isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:${customerId}::chid:siteId` + }, 'secret') const auth = new Auth({...config, fetchedToken}) await auth.ready() expect(auth.get('access_token')).toBe(fetchedToken) - expect(auth.get('customer_id')).toBe('abjbeMlITbrgoyAC6MdyGGR9C5') - expect(auth.get('usid')).toBe('b4865233-de92-4039-b944-aa2dfc8c1ea5') + expect(auth.get('customer_id')).toBe(customerId) + expect(auth.get('usid')).toBe(usid) expect(auth.get('customer_type')).toBe('registered') }) test('ready - use `fetchedToken` and auth data is populated for guest user', async () => { - const fetchedToken = - 'eyJ2ZXIiOiIxLjAiLCJqa3UiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJraWQiOiJiMjNkZTU5YS1iMTk3LTQyNTAtODdkNy1mNDFmNmUzNjcwNzciLCJ0eXAiOiJqd3QiLCJjbHYiOiJKMi4zLjQiLCJhbGciOiJFUzI1NiJ9.eyJhdXQiOiJHVUlEIiwic2NwIjoic2ZjYy5zaG9wcGVyLW15YWNjb3VudC5iYXNrZXRzIHNmY2Muc2hvcHBlci1teWFjY291bnQuYWRkcmVzc2VzIHNmY2Muc2hvcHBlci1wcm9kdWN0cyBzZmNjLnNob3BwZXItZGlzY292ZXJ5LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnJ3IHNmY2Muc2hvcHBlci1teWFjY291bnQucGF5bWVudGluc3RydW1lbnRzIHNmY2Muc2hvcHBlci1jdXN0b21lcnMubG9naW4gc2ZjYy5zaG9wcGVyLWV4cGVyaWVuY2Ugc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5vcmRlcnMgc2ZjYy5zaG9wcGVyLWN1c3RvbWVycy5yZWdpc3RlciBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5hZGRyZXNzZXMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wcm9kdWN0bGlzdHMucncgc2ZjYy5zaG9wcGVyLXByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItcHJvbW90aW9ucyBzZmNjLnNob3BwZXItYmFza2V0cy1vcmRlcnMucncgc2ZjYy5zaG9wcGVyLW15YWNjb3VudC5wYXltZW50aW5zdHJ1bWVudHMucncgc2ZjYy5zaG9wcGVyLWdpZnQtY2VydGlmaWNhdGVzIHNmY2Muc2hvcHBlci1wcm9kdWN0LXNlYXJjaCBzZmNjLnNob3BwZXItbXlhY2NvdW50LnByb2R1Y3RsaXN0cyBzZmNjLnNob3BwZXItY2F0ZWdvcmllcyBzZmNjLnNob3BwZXItbXlhY2NvdW50Iiwic3ViIjoiY2Mtc2xhczo6enpyZl8wMDE6OnNjaWQ6YzljNDViZmQtMGVkMy00YWEyLTk5NzEtNDBmODg5NjJiODM2Ojp1c2lkOjczN2ZiZDQwLWE2N2YtNDI4MS1iMjNmLTEyMzFlMzJmOWVlNSIsImN0eCI6InNsYXMiLCJpc3MiOiJzbGFzL3Byb2QvenpyZl8wMDEiLCJpc3QiOjEsImF1ZCI6ImNvbW1lcmNlY2xvdWQvcHJvZC96enJmXzAwMSIsIm5iZiI6MTY3ODY4NTk1OSwic3R5IjoiVXNlciIsImlzYiI6InVpZG86c2xhczo6dXBuOkd1ZXN0Ojp1aWRuOkd1ZXN0IFVzZXI6OmdjaWQ6YmNsWGsxeEtoSWxiYVJ3cncxeEdZWWtIRVY6OmNoaWQ6ICIsImV4cCI6MTY3ODY4Nzc4OSwiaWF0IjoxNjc4Njg1OTg5LCJqdGkiOiJDMkM0ODU2MjAxODYwLTE4OTA2Nzg5MDM0NjU3NDI4MTYxMDQ3Njk4In0.WJUcC7rKHzOZ91ccmn95RXnhjmsFI1WWPyauQXtl-oDwD0OKiaQy1TLFmWrVVpZWgkJekQ-9w6AolqeEo5zWHA' + // isb: `uido:slas::upn:Guest::uidn:Guest User::gcid:bclrdGlbIZlHaRxHsZlWYYxHwZ::chid: ` + const usid = 'usidddddd' + const customerId = 'customerIddddddd' + const fetchedToken = jwt.sign({ + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, + isb: `uido:ecom::upn:Guest::uidn:firstname lastname::gcid:${customerId}::rcid:registeredCid::chid:siteId` + }, 'secret') const auth = new Auth({...config, fetchedToken}) await auth.ready() expect(auth.get('access_token')).toBe(fetchedToken) - expect(auth.get('customer_id')).toBe('bclXk1xKhIlbaRwrw1xGYYkHEV') - expect(auth.get('usid')).toBe('737fbd40-a67f-4281-b23f-1231e32f9ee5') + expect(auth.get('customer_id')).toBe(customerId) + expect(auth.get('usid')).toBe(usid) expect(auth.get('customer_type')).toBe('guest') }) test('ready - use refresh token when access token is expired', async () => { From a4067b5f3474b57aad4faa9284ebda13f2d46348 Mon Sep 17 00:00:00 2001 From: Kevin He Date: Mon, 13 Mar 2023 10:29:58 -0700 Subject: [PATCH 9/9] lint --- .../commerce-sdk-react/src/auth/index.test.ts | 33 ++++++++++++------- packages/commerce-sdk-react/src/auth/index.ts | 15 ++------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/packages/commerce-sdk-react/src/auth/index.test.ts b/packages/commerce-sdk-react/src/auth/index.test.ts index 47ebea9e2c..cdfce86201 100644 --- a/packages/commerce-sdk-react/src/auth/index.test.ts +++ b/packages/commerce-sdk-react/src/auth/index.test.ts @@ -190,10 +190,13 @@ describe('Auth', () => { expect(auth.ready()).resolves.toEqual(result) }) test('ready - use `fetchedToken` and short circuit network request', async () => { - const fetchedToken = jwt.sign({ - sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:usid`, - isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:rcid::chid:siteId` - }, 'secret') + const fetchedToken = jwt.sign( + { + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:usid`, + isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:rcid::chid:siteId` + }, + 'secret' + ) const auth = new Auth({...config, fetchedToken}) jest.spyOn(auth, 'queueRequest') await auth.ready() @@ -202,10 +205,13 @@ describe('Auth', () => { test('ready - use `fetchedToken` and auth data is populated for registered user', async () => { const usid = 'usidddddd' const customerId = 'customerIddddddd' - const fetchedToken = jwt.sign({ - sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, - isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:${customerId}::chid:siteId` - }, 'secret') + const fetchedToken = jwt.sign( + { + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, + isb: `uido:ecom::upn:test@gmail.com::uidn:firstname lastname::gcid:guestuserid::rcid:${customerId}::chid:siteId` + }, + 'secret' + ) const auth = new Auth({...config, fetchedToken}) await auth.ready() expect(auth.get('access_token')).toBe(fetchedToken) @@ -217,10 +223,13 @@ describe('Auth', () => { // isb: `uido:slas::upn:Guest::uidn:Guest User::gcid:bclrdGlbIZlHaRxHsZlWYYxHwZ::chid: ` const usid = 'usidddddd' const customerId = 'customerIddddddd' - const fetchedToken = jwt.sign({ - sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, - isb: `uido:ecom::upn:Guest::uidn:firstname lastname::gcid:${customerId}::rcid:registeredCid::chid:siteId` - }, 'secret') + const fetchedToken = jwt.sign( + { + sub: `cc-slas::zzrf_001::scid:xxxxxx::usid:${usid}`, + isb: `uido:ecom::upn:Guest::uidn:firstname lastname::gcid:${customerId}::rcid:registeredCid::chid:siteId` + }, + 'secret' + ) const auth = new Auth({...config, fetchedToken}) await auth.ready() expect(auth.get('access_token')).toBe(fetchedToken) diff --git a/packages/commerce-sdk-react/src/auth/index.ts b/packages/commerce-sdk-react/src/auth/index.ts index 707707fc1c..1cf1719751 100644 --- a/packages/commerce-sdk-react/src/auth/index.ts +++ b/packages/commerce-sdk-react/src/auth/index.ts @@ -11,7 +11,7 @@ import { ShopperLoginTypes, ShopperCustomersTypes } from 'commerce-sdk-isomorphic' -import jwtDecode from 'jwt-decode' +import jwtDecode, {JwtPayload} from 'jwt-decode' import {ApiClientConfigParams, Prettify, RemoveStringIndex} from '../hooks/types' import {BaseStorage, LocalStorage, CookieStorage, MemoryStorage, StorageType} from './storage' import {CustomerType} from '../hooks/useCustomerType' @@ -31,20 +31,9 @@ interface JWTHeaders { iat: number } -interface SlasJwtPayload { - aut: string - scp: string +interface SlasJwtPayload extends JwtPayload { sub: string - ctx: string - iss: string - ist: number - aud: string - nbf: number - sty: string isb: string - exp: number - iat: number - jti: string } /**