@azure/functions
Version:
Microsoft Azure Functions NodeJS Framework
57 lines (49 loc) • 2.24 kB
text/typescript
// 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;
}