UNPKG

@microsoft/teams.apps

Version:

<p> <a href="https://www.npmjs.com/package/@microsoft/teams.apps" target="_blank"> <img src="https://img.shields.io/npm/v/@microsoft/teams.apps/latest" /> </a> <a href="https://www.npmjs.com/package/@microsoft/teams.apps?activeTab=code

70 lines • 5.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RemoteFunctionValidator = void 0; const jwt_validator_1 = require("./jwt-validator"); /** * Remote function validator for /api/functions/* requests * Wraps an Entra token validator and provides a simple check() method */ class RemoteFunctionValidator { entraTokenValidator; logger; constructor(entraTokenValidator, logger) { this.entraTokenValidator = entraTokenValidator; this.logger = logger; } /** * Create a remote function validator for Entra tokens */ static create(tenantId, clientId, logger, options) { const jwtValidator = new jwt_validator_1.JwtValidator({ clientId, tenantId, validateIssuer: { allowedTenantIds: options?.allowedTenantIds }, validateScope: options?.requiredScope ? { requiredScope: options.requiredScope } : undefined, jwksUriOptions: { type: 'tenantId' } }, logger); return new RemoteFunctionValidator(jwtValidator, logger); } async check(headers) { const h = (key) => { const v = headers[key]; return Array.isArray(v) ? v[0] : v; }; const appSessionId = h('x-teams-app-session-id'); const pageId = h('x-teams-page-id'); const authorization = h('authorization')?.split(' '); const authToken = authorization?.length === 2 && authorization[0].toLowerCase() === 'bearer' ? authorization[1] : ''; const tokenPayload = await this.entraTokenValidator.validateAccessToken(authToken); if (!pageId || !appSessionId || !authToken || !tokenPayload) { this.logger.debug('unauthorized - missing required headers or invalid token'); return null; } return { appId: tokenPayload?.['appId'], appSessionId, authToken, channelId: h('x-teams-channel-id'), chatId: h('x-teams-chat-id'), meetingId: h('x-teams-meeting-id'), messageId: h('x-teams-message-id'), pageId, subPageId: h('x-teams-sub-page-id'), teamId: h('x-teams-team-id'), tenantId: tokenPayload['tid'], userId: tokenPayload['oid'], userName: tokenPayload['name'], }; } } exports.RemoteFunctionValidator = RemoteFunctionValidator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLWZ1bmN0aW9uLXZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgvcmVtb3RlLWZ1bmN0aW9uLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSxtREFBK0M7QUFFL0M7OztHQUdHO0FBQ0gsTUFBYSx1QkFBdUI7SUFDMUIsbUJBQW1CLENBQTRDO0lBQy9ELE1BQU0sQ0FBVTtJQUV4QixZQUFZLG1CQUE4RCxFQUFFLE1BQWU7UUFDekYsSUFBSSxDQUFDLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDO1FBQy9DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQ1gsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsTUFBZSxFQUNmLE9BR0M7UUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLDRCQUFZLENBQUM7WUFDcEMsUUFBUTtZQUNSLFFBQVE7WUFDUixjQUFjLEVBQUU7Z0JBQ2QsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQjthQUM1QztZQUNELGFBQWEsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDNUYsY0FBYyxFQUFFO2dCQUNkLElBQUksRUFBRSxVQUFVO2FBQ2pCO1NBQ0YsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVYLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBMEM7UUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUN4QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUM7UUFDRixNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUNqRCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwQyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sU0FBUyxHQUNiLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO1lBQ3hFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVuRixJQUNFLENBQUMsTUFBTTtZQUNQLENBQUMsWUFBWTtZQUNiLENBQUMsU0FBUztZQUNWLENBQUMsWUFBWSxFQUNiLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1lBQzlFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU87WUFDTCxLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQzlCLFlBQVk7WUFDWixTQUFTO1lBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztZQUNsQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1lBQzVCLFNBQVMsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUM7WUFDbEMsU0FBUyxFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQztZQUNsQyxNQUFNO1lBQ04sU0FBUyxFQUFFLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQztZQUNuQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO1lBQzVCLFFBQVEsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzdCLE1BQU0sRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1lBQzNCLFFBQVEsRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO1NBQy9CLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUE3RUQsMERBNkVDIn0=