- private isValidBasicAuth(req: IncomingMessage): boolean {
- const authorizationHeader = req.headers.authorization ?? '';
- const authorizationToken = authorizationHeader.split(/\s+/).pop() ?? '';
- const authentication = Buffer.from(authorizationToken, 'base64').toString();
- const authenticationParts = authentication.split(/:/);
- const username = authenticationParts.shift();
- const password = authenticationParts.join(':');
+ private isValidBasicAuth (req: IncomingMessage, next: (err?: Error) => void): boolean {
+ const [username, password] = getUsernameAndPasswordFromAuthorizationToken(
+ req.headers.authorization?.split(/\s+/).pop() ?? '',
+ next
+ )
+ return this.isValidUsernameAndPassword(username, password)
+ }
+
+ private isValidProtocolBasicAuth (req: IncomingMessage, next: (err?: Error) => void): boolean {
+ const authorizationProtocol = req.headers['sec-websocket-protocol']?.split(/,\s+/).pop()
+ const [username, password] = getUsernameAndPasswordFromAuthorizationToken(
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+ `${authorizationProtocol}${Array(((4 - (authorizationProtocol!.length % 4)) % 4) + 1).join(
+ '='
+ )}`
+ .split('.')
+ .pop() ?? '',
+ next
+ )
+ return this.isValidUsernameAndPassword(username, password)
+ }
+
+ private isValidUsernameAndPassword (username: string, password: string): boolean {