From c5e175cde95ceba6e324fdc06343f140e077ab4f Mon Sep 17 00:00:00 2001 From: Colton Padden Date: Wed, 22 Dec 2021 14:14:31 -0500 Subject: [PATCH 1/4] remove axios dependency from rollbar-backend Signed-off-by: Colton Padden --- .changeset/plenty-flies-repair.md | 5 +++ plugins/rollbar-backend/package.json | 4 ++- .../src/api/RollbarApi.test.ts | 34 ++++++++++++++++++- plugins/rollbar-backend/src/api/RollbarApi.ts | 13 +++---- 4 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 .changeset/plenty-flies-repair.md diff --git a/.changeset/plenty-flies-repair.md b/.changeset/plenty-flies-repair.md new file mode 100644 index 0000000000..7e9690a7f3 --- /dev/null +++ b/.changeset/plenty-flies-repair.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-rollbar-backend': patch +--- + +Replace the usage of `axios` with `node-fetch` in the Rollbar API diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index 6fbecdbc3d..3c7cbd5ee9 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -33,8 +33,8 @@ "dependencies": { "@backstage/backend-common": "^0.9.12", "@backstage/config": "^0.1.10", + "@backstage/test-utils": "^0.1.24", "@types/express": "^4.17.6", - "axios": "^0.24.0", "camelcase-keys": "^6.2.2", "compression": "^1.7.4", "cors": "^2.8.5", @@ -44,12 +44,14 @@ "helmet": "^4.0.0", "lodash": "^4.17.21", "morgan": "^1.10.0", + "node-fetch": "^2.6.1", "winston": "^3.2.1", "yn": "^4.0.0" }, "devDependencies": { "@backstage/cli": "^0.10.0", "@types/supertest": "^2.0.8", + "msw": "^0.36.3", "supertest": "^6.1.3" }, "files": [ diff --git a/plugins/rollbar-backend/src/api/RollbarApi.test.ts b/plugins/rollbar-backend/src/api/RollbarApi.test.ts index 66a3955f3a..8936bb1839 100644 --- a/plugins/rollbar-backend/src/api/RollbarApi.test.ts +++ b/plugins/rollbar-backend/src/api/RollbarApi.test.ts @@ -14,7 +14,12 @@ * limitations under the License. */ -import { getRequestHeaders } from './RollbarApi'; +import { getRequestHeaders, RollbarApi } from './RollbarApi'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { getVoidLogger } from '@backstage/backend-common'; +import { RollbarProject } from './types'; describe('RollbarApi', () => { describe('getRequestHeaders', () => { @@ -26,4 +31,31 @@ describe('RollbarApi', () => { }); }); }); + + describe('getAllProjects', () => { + const server = setupServer(); + setupRequestMockHandlers(server); + + const mockBaseUrl = 'https://api.rollbar.com/api/1'; + + const mockProjects: RollbarProject[] = [ + { id: 123, name: 'abc', accountId: 1, status: 'enabled' }, + { id: 456, name: 'xyz', accountId: 1, status: 'enabled' }, + ]; + + const setupHandlers = () => { + server.use( + rest.get(`${mockBaseUrl}/projects`, (_, res, ctx) => { + return res(ctx.json({ result: mockProjects })); + }), + ); + }; + + it('should return all projects with a name attribute', async () => { + setupHandlers(); + const api = new RollbarApi('my-access-token', getVoidLogger()); + const projects = await api.getAllProjects(); + expect(projects).toEqual(mockProjects); + }); + }); }); diff --git a/plugins/rollbar-backend/src/api/RollbarApi.ts b/plugins/rollbar-backend/src/api/RollbarApi.ts index 67d0535942..245164b531 100644 --- a/plugins/rollbar-backend/src/api/RollbarApi.ts +++ b/plugins/rollbar-backend/src/api/RollbarApi.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import axios from 'axios'; import { Logger } from 'winston'; import camelcaseKeys from 'camelcase-keys'; import { buildQuery } from '../util'; @@ -25,6 +24,7 @@ import { RollbarProjectAccessToken, RollbarTopActiveItem, } from './types'; +import fetch from 'node-fetch'; const baseUrl = 'https://api.rollbar.com/api/1'; @@ -110,11 +110,12 @@ export class RollbarApi { this.logger.info(`Calling Rollbar REST API, ${fullUrl}`); } - return axios - .get(fullUrl, getRequestHeaders(accessToken || this.accessToken || '')) - .then(response => - camelcaseKeys(response?.data?.result, { deep: true }), - ); + return fetch( + fullUrl, + getRequestHeaders(accessToken || this.accessToken || ''), + ) + .then(response => response.json()) + .then(json => camelcaseKeys(json?.result, { deep: true })); } private async getForProject( From f0f81f6cc7a56e71e462987dee5850deb28f4917 Mon Sep 17 00:00:00 2001 From: Colton Padden Date: Wed, 22 Dec 2021 14:23:16 -0500 Subject: [PATCH 2/4] remove got dependency from auth-backend Signed-off-by: Colton Padden --- .changeset/chatty-gifts-fry.md | 5 ++++ plugins/auth-backend/package.json | 1 - .../src/providers/microsoft/provider.ts | 25 +++++++++---------- 3 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 .changeset/chatty-gifts-fry.md diff --git a/.changeset/chatty-gifts-fry.md b/.changeset/chatty-gifts-fry.md new file mode 100644 index 0000000000..25f0a70bd9 --- /dev/null +++ b/.changeset/chatty-gifts-fry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Replaces the usage of `got` with `node-fetch` in the `getUserPhoto` method of the Microsoft provider diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index c7d208eef2..5a7769c0fb 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -46,7 +46,6 @@ "express-promise-router": "^4.1.0", "express-session": "^1.17.1", "fs-extra": "9.1.0", - "got": "^11.5.2", "helmet": "^4.0.0", "jose": "^1.27.1", "jwt-decode": "^3.1.0", diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index 2dc259fe74..66bb32cfdd 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -45,7 +45,7 @@ import { SignInResolver, } from '../types'; import { Logger } from 'winston'; -import got from 'got'; +import fetch from 'node-fetch'; type PrivateInfo = { refreshToken: string; @@ -173,19 +173,18 @@ export class MicrosoftAuthProvider implements OAuthHandlers { private getUserPhoto(accessToken: string): Promise { return new Promise(resolve => { - got - .get('https://graph.microsoft.com/v1.0/me/photos/48x48/$value', { - encoding: 'binary', - responseType: 'buffer', - headers: { - Authorization: `Bearer ${accessToken}`, - }, - }) - .then(photoData => { - const photoURL = `data:image/jpeg;base64,${Buffer.from( - photoData.body, + fetch('https://graph.microsoft.com/v1.0/me/photos/48x48/$value', { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + .then(response => response.arrayBuffer()) + .then(arrayBuffer => { + console.log(Buffer.from(arrayBuffer).toString('utf-8')); + const imageUrl = `data:image/jpeg;base64,${Buffer.from( + arrayBuffer, ).toString('base64')}`; - resolve(photoURL); + resolve(imageUrl); }) .catch(error => { this.logger.warn( From 22bb6fad0c9b675822083b08dbd6cd2b8aab45a9 Mon Sep 17 00:00:00 2001 From: Colton Padden Date: Wed, 22 Dec 2021 14:23:27 -0500 Subject: [PATCH 3/4] update yarn.lock after axios and got top-level dependency removal Signed-off-by: Colton Padden --- yarn.lock | 96 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 77 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 422531d3a4..1a91885e6c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4927,7 +4927,7 @@ "@types/set-cookie-parser" "^2.4.0" set-cookie-parser "^2.4.6" -"@mswjs/interceptors@^0.12.6": +"@mswjs/interceptors@^0.12.6", "@mswjs/interceptors@^0.12.7": version "0.12.7" resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.12.7.tgz#0d1cd4cd31a0f663e0455993951201faa09d0909" integrity sha512-eGjZ3JRAt0Fzi5FgXiV/P3bJGj0NqsN7vBS0J0FO2AQRQ0jCKQS4lEFm4wvlSgKQNfeuc/Vz6d81VtU3Gkx/zg== @@ -9996,13 +9996,6 @@ axios@^0.21.1, axios@^0.21.4: dependencies: follow-redirects "^1.14.0" -axios@^0.24.0: - version "0.24.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" @@ -11104,6 +11097,14 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.0.0, chalk@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -11123,14 +11124,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" - integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - change-case-all@1.0.14: version "1.0.14" resolved "https://registry.npmjs.org/change-case-all/-/change-case-all-1.0.14.tgz#bac04da08ad143278d0ac3dda7eccd39280bfba1" @@ -15248,7 +15241,7 @@ fn.name@1.x.x: resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.4: +follow-redirects@^1.0.0, follow-redirects@^1.14.0: version "1.14.6" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd" integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A== @@ -16096,7 +16089,7 @@ google-p12-pem@^3.0.3: dependencies: node-forge "^0.10.0" -got@^11.5.2, got@^11.8.0, got@^11.8.2: +got@^11.8.0, got@^11.8.2: version "11.8.2" resolved "https://registry.npmjs.org/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== @@ -17242,7 +17235,7 @@ inquirer@^8.0.0: strip-ansi "^6.0.0" through "^2.3.6" -inquirer@^8.1.1: +inquirer@^8.1.1, inquirer@^8.2.0: version "8.2.0" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== @@ -21383,6 +21376,32 @@ msw@^0.35.0: type-fest "^1.2.2" yargs "^17.0.1" +msw@^0.36.3: + version "0.36.3" + resolved "https://registry.npmjs.org/msw/-/msw-0.36.3.tgz#7feb243a5fcf563806d45edc027bc36144741170" + integrity sha512-Itzp/QhKaleZoslXDrNik3ramW9ynqzOdbwydX2ehBSSaZd5QoiAl/bHYcV33R6CEZcJgIX1N4s+G6XkF/bhkA== + dependencies: + "@mswjs/cookies" "^0.1.6" + "@mswjs/interceptors" "^0.12.7" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/inquirer" "^8.1.3" + "@types/js-levenshtein" "^1.1.0" + chalk "4.1.1" + chokidar "^3.4.2" + cookie "^0.4.1" + graphql "^15.5.1" + headers-utils "^3.0.2" + inquirer "^8.2.0" + is-node-process "^1.0.1" + js-levenshtein "^1.1.6" + node-fetch "^2.6.1" + path-to-regexp "^6.2.0" + statuses "^2.0.0" + strict-event-emitter "^0.2.0" + type-fest "^1.2.2" + yargs "^17.3.0" + multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" @@ -22997,6 +23016,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-to-regexp@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38" + integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg== + path-type@^1.0.0: version "1.1.0" resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -26969,6 +26993,15 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + "string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.6: version "4.0.6" resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" @@ -27066,6 +27099,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.0: version "7.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -29943,6 +29983,11 @@ yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + yargs-parser@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz#5081355d19d9d0c8c5d81ada908cb4e6d186664f" @@ -30007,6 +30052,19 @@ yargs@^17.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.3.0: + version "17.3.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.3.0.tgz#295c4ffd0eef148ef3e48f7a2e0f58d0e4f26b1c" + integrity sha512-GQl1pWyDoGptFPJx9b9L6kmR33TGusZvXIZUT+BOz9f7X2L94oeAskFYLEg/FkhV06zZPBYLvLZRWeYId29lew== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yargs@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz#3355144977d05757dbb86d6e38ec056123b3a66e" From 7e45b03f4d7c890f88e7f3b07fab682b2db986d6 Mon Sep 17 00:00:00 2001 From: Colton Padden Date: Thu, 23 Dec 2021 10:57:36 -0500 Subject: [PATCH 4/4] add msw intercept for graph.microsoft and test photo query response Signed-off-by: Colton Padden --- .../src/providers/microsoft/provider.test.ts | 132 +++++++++++++----- .../src/providers/microsoft/provider.ts | 1 - 2 files changed, 99 insertions(+), 34 deletions(-) diff --git a/plugins/auth-backend/src/providers/microsoft/provider.test.ts b/plugins/auth-backend/src/providers/microsoft/provider.test.ts index 429e6691b6..2734878077 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.test.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.test.ts @@ -20,6 +20,9 @@ import { OAuthResult } from '../../lib/oauth'; import { getVoidLogger } from '@backstage/backend-common'; import { TokenIssuer } from '../../identity/types'; import { CatalogIdentityClient } from '../../lib/catalog'; +import { setupRequestMockHandlers } from '@backstage/test-utils'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; const mockFrameHandler = jest.spyOn( helpers, @@ -28,8 +31,62 @@ const mockFrameHandler = jest.spyOn( () => Promise<{ result: OAuthResult; privateInfo: any }> >; +const mockResult = { + result: { + fullProfile: { + emails: [ + { + type: 'work', + value: 'conrad@example.com', + }, + ], + displayName: 'Conrad', + name: { + familyName: 'Ribas', + givenName: 'Francisco', + }, + id: 'conrad', + provider: 'microsoft', + photos: [ + { + value: 'some-data', + }, + ], + }, + params: { + id_token: 'idToken', + scope: 'scope', + expires_in: 123, + }, + accessToken: 'accessToken', + }, + privateInfo: { + refreshToken: 'wacka', + }, +}; + +const server = setupServer(); +setupRequestMockHandlers(server); + +const setupHandlers = () => { + server.use( + rest.get( + 'https://graph.microsoft.com/v1.0/me/photos/*', + async (_, res, ctx) => { + const imageBuffer = new Uint8Array([104, 111, 119, 100, 121]).buffer; + return res( + ctx.set('Content-Length', imageBuffer.byteLength.toString()), + ctx.set('Content-Type', 'image/jpeg'), + ctx.body(imageBuffer), + ); + }, + ), + ); +}; + describe('createMicrosoftProvider', () => { it('should auth', async () => { + setupHandlers(); const tokenIssuer = { issueToken: jest.fn(), listPublicKeys: jest.fn(), @@ -55,39 +112,7 @@ describe('createMicrosoftProvider', () => { callbackUrl: 'mock', }); - mockFrameHandler.mockResolvedValueOnce({ - result: { - fullProfile: { - emails: [ - { - type: 'work', - value: 'conrad@example.com', - }, - ], - displayName: 'Conrad', - name: { - familyName: 'Ribas', - givenName: 'Francisco', - }, - id: 'conrad', - provider: 'microsoft', - photos: [ - { - value: 'some-data', - }, - ], - }, - params: { - id_token: 'idToken', - scope: 'scope', - expires_in: 123, - }, - accessToken: 'accessToken', - }, - privateInfo: { - refreshToken: 'wacka', - }, - }); + mockFrameHandler.mockResolvedValueOnce(mockResult); const { response } = await provider.handler({} as any); expect(response).toEqual({ providerInfo: { @@ -103,4 +128,45 @@ describe('createMicrosoftProvider', () => { }, }); }); + + it('should return the base64 encoded photo data of the profile', async () => { + setupHandlers(); + const tokenIssuer = { + issueToken: jest.fn(), + listPublicKeys: jest.fn(), + }; + const catalogIdentityClient = { + findUser: jest.fn(), + }; + + const provider = new MicrosoftAuthProvider({ + logger: getVoidLogger(), + catalogIdentityClient: + catalogIdentityClient as unknown as CatalogIdentityClient, + tokenIssuer: tokenIssuer as unknown as TokenIssuer, + authHandler: async ({ fullProfile }) => ({ + profile: { + email: fullProfile.emails![0]!.value, + displayName: fullProfile.displayName, + picture: 'http://microsoft.com/lols', + }, + }), + clientId: 'mock', + clientSecret: 'mock', + callbackUrl: 'mock', + // define resolver to return user `info` for photo validation + signInResolver: async (info, _) => { + return { + id: 'user.name', + token: 'token', + info: info, + }; + }, + }); + mockFrameHandler.mockResolvedValueOnce(mockResult); + const { response } = await provider.handler({} as any); + const overloadedIdentity = response.backstageIdentity as any; + const photo = overloadedIdentity.info.result.fullProfile.photos[0]; + expect(photo.value).toEqual('data:image/jpeg;base64,aG93ZHk='); + }); }); diff --git a/plugins/auth-backend/src/providers/microsoft/provider.ts b/plugins/auth-backend/src/providers/microsoft/provider.ts index 66bb32cfdd..b21218c066 100644 --- a/plugins/auth-backend/src/providers/microsoft/provider.ts +++ b/plugins/auth-backend/src/providers/microsoft/provider.ts @@ -180,7 +180,6 @@ export class MicrosoftAuthProvider implements OAuthHandlers { }) .then(response => response.arrayBuffer()) .then(arrayBuffer => { - console.log(Buffer.from(arrayBuffer).toString('utf-8')); const imageUrl = `data:image/jpeg;base64,${Buffer.from( arrayBuffer, ).toString('base64')}`;