Bird
Raised Fist0
Expressframework~20 mins

Authentication in WebSocket connections in Express - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
WebSocket Authentication Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ component_behavior
intermediate
2:00remaining
How does token authentication affect WebSocket connection establishment?

Consider a WebSocket server using Express and a token-based authentication system. What happens if the client tries to connect without sending a valid token in the connection request?

AThe server accepts the connection and allows all messages without checking the token.
BThe server upgrades the connection but disconnects the client after the first message.
CThe server immediately closes the connection without upgrading the HTTP request to WebSocket.
DThe server delays the connection upgrade until the token is verified asynchronously.
Attempts:
2 left
💡 Hint

Think about when authentication should happen in the WebSocket handshake process.

📝 Syntax
intermediate
2:00remaining
Which code snippet correctly extracts a token from WebSocket connection headers in Express?

Given an Express WebSocket server, which code correctly retrieves a Bearer token from the Authorization header during the upgrade event?

Aconst token = req.headers.authorization.replace('Bearer ', '');
Bconst token = req.headers.authorization.split('Bearer')[1];
Cconst token = req.headers['Authorization'].split(' ')[0];
Dconst token = req.headers['authorization'].split(' ')[1];
Attempts:
2 left
💡 Hint

Remember the format of the Authorization header: 'Bearer <token>'.

🔧 Debug
advanced
2:00remaining
Why does this WebSocket server accept connections without token validation?

Review the following Express WebSocket upgrade handler code snippet:

server.on('upgrade', (req, socket, head) => {
  const token = req.headers['authorization']?.split(' ')[1];
  if (!token) {
    socket.destroy();
    return;
  }
  wss.handleUpgrade(req, socket, head, (ws) => {
    wss.emit('connection', ws, req);
  });
});

Clients without tokens still connect successfully. Why?

Express
server.on('upgrade', (req, socket, head) => {
  const token = req.headers['authorization']?.split(' ')[1];
  if (!token) {
    socket.destroy();
    return;
  }
  wss.handleUpgrade(req, socket, head, (ws) => {
    wss.emit('connection', ws, req);
  });
});
AThe optional chaining operator returns undefined, so the if condition never triggers for missing headers.
BThe server does not verify the token value; it only checks if it exists, so any token passes.
CThe token variable is undefined but the socket.destroy() call is asynchronous and delayed.
DThe handleUpgrade method upgrades the connection before the token check, allowing all clients.
Attempts:
2 left
💡 Hint

Look carefully at what the code does with the token after extracting it.

❓ state_output
advanced
2:00remaining
What is the value of ws.isAuthenticated after connection if token is valid?

In an Express WebSocket server, the following code runs on connection:

wss.on('connection', (ws, req) => {
  const token = req.headers['authorization']?.split(' ')[1];
  ws.isAuthenticated = verifyToken(token);
});

If verifyToken returns true for a valid token, what is the value of ws.isAuthenticated for a client with a valid token?

Express
wss.on('connection', (ws, req) => {
  const token = req.headers['authorization']?.split(' ')[1];
  ws.isAuthenticated = verifyToken(token);
});
Atrue
Bnull
Cundefined
Dfalse
Attempts:
2 left
💡 Hint

What does the verifyToken function return for valid tokens?

🧠 Conceptual
expert
3:00remaining
Why is authenticating during the WebSocket upgrade request preferred over authenticating after connection?

In Express WebSocket servers, why should authentication be done during the HTTP upgrade request instead of after the WebSocket connection is established?

ABecause the HTTP upgrade request allows rejecting unauthorized clients before allocating WebSocket resources.
BBecause WebSocket connections do not support sending headers after connection is established.
CBecause authenticating after connection requires sending a special authentication message which is less secure.
DBecause Express automatically blocks unauthorized WebSocket connections if authentication is done after connection.
Attempts:
2 left
💡 Hint

Think about resource usage and security risks of accepting connections before authentication.

Practice

(1/5)
1. In Express with WebSocket, when does authentication usually happen for a WebSocket connection?
easy
A. During the HTTP upgrade request before the WebSocket connection is established
B. After the WebSocket connection is fully established
C. Only when sending the first message over WebSocket
D. Authentication is not needed for WebSocket connections

Solution

  1. Step 1: Understand WebSocket handshake

    The WebSocket connection starts with an HTTP upgrade request from client to server.
  2. Step 2: Identify when authentication fits

    Authentication must happen during this upgrade request to allow or deny the connection before it opens.
  3. Final Answer:

    During the HTTP upgrade request before the WebSocket connection is established -> Option A
  4. Quick Check:

    Authentication = HTTP upgrade request [OK]
Hint: Authenticate during upgrade request, not after connection opens [OK]
Common Mistakes:
  • Trying to authenticate after WebSocket connection opens
  • Assuming authentication is unnecessary for WebSocket
  • Authenticating only on first message instead of handshake
2. Which of the following is a correct way to send an authentication token during a WebSocket connection upgrade in Express?
easy
A. Include the token in the WebSocket message after connection opens
B. Send the token as a URL query parameter in the WebSocket URL
C. Send the token in a cookie after the connection is established
D. Send the token in a separate HTTP POST request after connection

Solution

  1. Step 1: Review token sending methods during upgrade

    Tokens can be sent in the URL query string or headers during the HTTP upgrade request.
  2. Step 2: Identify valid option

    Sending the token as a URL query parameter is a common and valid method to authenticate during upgrade.
  3. Final Answer:

    Send the token as a URL query parameter in the WebSocket URL -> Option B
  4. Quick Check:

    Token in URL query = valid during upgrade [OK]
Hint: Use URL query or headers to send token during upgrade [OK]
Common Mistakes:
  • Sending token only after connection opens
  • Using cookies after connection instead of during upgrade
  • Sending token in separate HTTP requests unrelated to upgrade
3. Consider this Express WebSocket upgrade handler snippet:
server.on('upgrade', (req, socket, head) => {
  const token = new URL(req.url, 'http://localhost').searchParams.get('token');
  if (token !== 'secret') {
    socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
    socket.destroy();
    return;
  }
  wss.handleUpgrade(req, socket, head, ws => {
    wss.emit('connection', ws, req);
  });
});
What happens if the token is incorrect?
medium
A. The server ignores the token and accepts the connection
B. The WebSocket connection is established but messages are blocked
C. The server throws an error and crashes
D. The socket connection is closed immediately with 401 Unauthorized

Solution

  1. Step 1: Analyze token check and socket handling

    If the token is not 'secret', the code writes a 401 Unauthorized response and destroys the socket immediately.
  2. Step 2: Understand socket.destroy effect

    Destroying the socket closes the connection before WebSocket handshake completes, rejecting the client.
  3. Final Answer:

    The socket connection is closed immediately with 401 Unauthorized -> Option D
  4. Quick Check:

    Invalid token = socket closed with 401 [OK]
Hint: Invalid token triggers socket destroy with 401 response [OK]
Common Mistakes:
  • Assuming connection is accepted but blocked later
  • Thinking server crashes on invalid token
  • Ignoring socket.destroy effect
4. Given this Express WebSocket upgrade code snippet:
server.on('upgrade', (req, socket, head) => {
  const token = req.headers['sec-websocket-protocol'];
  if (!token || token !== 'valid-token') {
    socket.end();
    return;
  }
  wss.handleUpgrade(req, socket, head, ws => {
    wss.emit('connection', ws, req);
  });
});
What is the main issue with this authentication approach?
medium
A. Using 'sec-websocket-protocol' header for token is incorrect and may cause handshake failure
B. Calling socket.end() instead of socket.destroy() leaks resources
C. Not checking token case-insensitively causes false negatives
D. Emitting 'connection' event before handleUpgrade causes errors

Solution

  1. Step 1: Understand 'sec-websocket-protocol' header usage

    This header is meant for subprotocol negotiation, not for authentication tokens.
  2. Step 2: Recognize handshake impact

    Misusing this header can cause handshake failure or client rejection because clients expect specific values here.
  3. Final Answer:

    Using 'sec-websocket-protocol' header for token is incorrect and may cause handshake failure -> Option A
  4. Quick Check:

    Wrong header for token breaks handshake [OK]
Hint: Use proper headers or URL query for tokens, not subprotocol header [OK]
Common Mistakes:
  • Assuming any header can carry token safely
  • Ignoring WebSocket protocol header purpose
  • Confusing socket.end() and socket.destroy() effects
5. You want to implement token-based authentication for WebSocket connections in Express. Which approach correctly combines token extraction and connection rejection to secure the WebSocket handshake?
server.on('upgrade', (req, socket, head) => {
  // Extract token
  const token = req.headers['authorization']?.split(' ')[1];
  // Verify token
  if (!token || token !== 'my-secret-token') {
    // Reject connection
    socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
    socket.destroy();
    return;
  }
  // Accept connection
  wss.handleUpgrade(req, socket, head, ws => {
    wss.emit('connection', ws, req);
  });
});
hard
A. socket.destroy() should be called after wss.handleUpgrade to reject connection
B. Token extraction from Authorization header is invalid; should use cookies instead
C. This approach correctly extracts token from Authorization header and rejects unauthorized connections during upgrade
D. Rejecting connection by writing 401 is unnecessary; just call socket.end()

Solution

  1. Step 1: Check token extraction method

    The code extracts the token from the Authorization header using standard Bearer token format.
  2. Step 2: Verify rejection method

    If token is invalid, it writes a 401 Unauthorized response and destroys the socket before upgrade completes, properly rejecting connection.
  3. Step 3: Confirm acceptance flow

    If token is valid, it calls handleUpgrade and emits connection event to accept the WebSocket connection.
  4. Final Answer:

    This approach correctly extracts token from Authorization header and rejects unauthorized connections during upgrade -> Option C
  5. Quick Check:

    Authorization header + socket.destroy() = secure upgrade [OK]
Hint: Extract token from Authorization header, reject with 401 and destroy socket [OK]
Common Mistakes:
  • Using cookies instead of headers for token during upgrade
  • Calling socket.destroy() after upgrade instead of before
  • Not sending 401 response before closing socket
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard