UNPKG

@azure/functions

Version:
57 lines (49 loc) 2.24 kB
// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. import { HttpRequestUser } from '@azure/functions'; import { nonNullValue } from '../utils/nonNull'; import { workerSystemLog } from '../utils/workerSystemLog'; /* grandfathered in. Should fix when possible */ /* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access */ export function extractHttpUserFromHeaders(headers: Headers): HttpRequestUser | null { let user: HttpRequestUser | null = null; const clientPrincipal = headers.get('x-ms-client-principal'); if (clientPrincipal) { let claimsPrincipalData: any; try { claimsPrincipalData = JSON.parse(Buffer.from(clientPrincipal, 'base64').toString('utf-8')); } catch (err) { workerSystemLog( 'warning', `Failed to parse x-ms-client-principal header: ${err instanceof Error ? err.message : String(err)}` ); return null; } if ( claimsPrincipalData === null || typeof claimsPrincipalData !== 'object' || Array.isArray(claimsPrincipalData) ) { workerSystemLog('warning', 'Parsed x-ms-client-principal header was not a JSON object.'); return null; } if (claimsPrincipalData['identityProvider']) { user = { type: 'StaticWebApps', id: claimsPrincipalData['userId'], username: claimsPrincipalData['userDetails'], identityProvider: claimsPrincipalData['identityProvider'], claimsPrincipalData, }; } else { user = { type: 'AppService', id: nonNullValue(headers.get('x-ms-client-principal-id'), 'user-id'), username: nonNullValue(headers.get('x-ms-client-principal-name'), 'user-name'), identityProvider: nonNullValue(headers.get('x-ms-client-principal-idp'), 'user-idp'), claimsPrincipalData, }; } } return user; }