openvibers/openvibe.shared middleware.js

middleware.js

main 2.3 KB · 76 lines · javascript

1'use strict';
2
3// ═══════════════════════════════════════════════════════════════
4// OpenVibe — Express Middleware
5// Auth middleware for services consuming OpenVibe.Network SSO tokens.
6// ═══════════════════════════════════════════════════════════════
7
8const { OpenVibeAuthClient } = require('./auth-client');
9
10/**
11 * Extract token from request.
12 * Priority: Authorization header → cookie → query param (WebSocket)
13 */
14function extractToken(req) {
15 // 1. Authorization: Bearer <token>
16 const authHeader = req.headers.authorization;
17 if (authHeader && authHeader.startsWith('Bearer ')) {
18 return authHeader.slice(7);
19 }
20 // 2. Cookie
21 if (req.cookies?.ov_token) return req.cookies.ov_token;
22 // 3. Query param (WebSocket upgrade)
23 if (req.query?.token) return req.query.token;
24 return null;
25}
26
27/**
28 * Create requireOpenVibeAuth middleware.
29 * Verifies JWT signed by OpenVibe.Network and attaches req.user.
30 *
31 * @param {OpenVibeAuthClient} authClient
32 * @returns {Function} Express middleware
33 */
34function requireOpenVibeAuth(authClient) {
35 return (req, res, next) => {
36 const token = extractToken(req);
37 if (!token) {
38 return res.status(401).json({ error: 'Authentication required' });
39 }
40 const user = authClient.verifyToken(token);
41 if (!user) {
42 return res.status(401).json({ error: 'Invalid or expired token' });
43 }
44 req.user = user;
45 req.token = token;
46 next();
47 };
48}
49
50/**
51 * Create optionalOpenVibeAuth middleware.
52 * Attaches req.user if a valid token is present, otherwise continues.
53 *
54 * @param {OpenVibeAuthClient} authClient
55 * @returns {Function} Express middleware
56 */
57function optionalOpenVibeAuth(authClient) {
58 return (req, _res, next) => {
59 const token = extractToken(req);
60 if (token) {
61 const user = authClient.verifyToken(token);
62 if (user) {
63 req.user = user;
64 req.token = token;
65 }
66 }
67 next();
68 };
69}
70
71module.exports = {
72 extractToken,
73 requireOpenVibeAuth,
74 optionalOpenVibeAuth,
75};
76