Register
Login
Resources
Docs Blog Datasets Glossary Case Studies Tutorials & Webinars
Product
Data Engine LLMs Platform Enterprise
Pricing Explore
Connect to our Discord channel

app.js 3.6 KB

You have to be logged in to leave a comment. Sign In
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  1. const express = require('express');
  2. const { providers } = require('promptfoo');
  3. const crypto = require('crypto');
  4. const fs = require('fs');
  5. const jks = require('jks-js');
  6. const app = express();
  7. app.use(express.json());
  8. // Add signature validation configuration for JKS
  9. const SIGNATURE_CONFIG = {
  10. keystorePath: './clientkeystore.jks',
  11. keystorePassword: 'password', // In real apps, use environment variables
  12. keyAlias: 'client', // Common alias for client certificates
  13. keyPassword: 'password', // In real apps, use environment variables
  14. signatureHeader: 'signature',
  15. timestampHeader: 'timestamp',
  16. clientIdHeader: 'client-id',
  17. signatureValidityMs: 300000, // 5 minutes
  18. signatureDataTemplate: 'promptfoo-app{{timestamp}}',
  19. signatureAlgorithm: 'SHA256',
  20. };
  21. // Load JKS keystore and extract public key
  22. let publicKey;
  23. try {
  24. const keystoreData = fs.readFileSync(SIGNATURE_CONFIG.keystorePath);
  25. const keystore = jks.toPem(keystoreData, SIGNATURE_CONFIG.keystorePassword);
  26. // Find the certificate by alias
  27. const cert = keystore[SIGNATURE_CONFIG.keyAlias];
  28. if (!cert) {
  29. throw new Error(`Certificate with alias '${SIGNATURE_CONFIG.keyAlias}' not found in keystore`);
  30. }
  31. publicKey = cert.cert;
  32. console.log('Successfully loaded JKS keystore and extracted public key');
  33. } catch (error) {
  34. console.error('Error loading JKS keystore:', error.message);
  35. console.error('Make sure keystore.jks exists and credentials are correct');
  36. process.exit(1);
  37. }
  38. // Signature validation middleware
  39. function validateSignature(req, res, next) {
  40. try {
  41. const signature = req.headers[SIGNATURE_CONFIG.signatureHeader];
  42. const timestamp = req.headers[SIGNATURE_CONFIG.timestampHeader];
  43. const clientId = req.headers[SIGNATURE_CONFIG.clientIdHeader];
  44. // Check if all required headers are present
  45. if (!signature || !timestamp || !clientId) {
  46. console.warn('Request rejected: Missing signature headers');
  47. return res.status(401).json({ error: 'Missing signature headers' });
  48. }
  49. // Check timestamp validity
  50. const now = Date.now();
  51. const requestTime = Number.parseInt(timestamp, 10);
  52. if (Number.isNaN(requestTime) || now - requestTime > SIGNATURE_CONFIG.signatureValidityMs) {
  53. console.warn('Request rejected: Signature expired or invalid timestamp');
  54. return res.status(401).json({ error: 'Signature expired or invalid timestamp' });
  55. }
  56. // Generate signature data using the template
  57. const signatureData = SIGNATURE_CONFIG.signatureDataTemplate.replace(
  58. '{{timestamp}}',
  59. timestamp,
  60. );
  61. // Verify signature using the public key from JKS
  62. const verify = crypto.createVerify(SIGNATURE_CONFIG.signatureAlgorithm);
  63. verify.update(signatureData);
  64. const isValid = verify.verify(publicKey, signature, 'base64');
  65. if (!isValid) {
  66. console.warn('Request rejected: Invalid signature');
  67. return res.status(401).json({ error: 'Invalid signature' });
  68. }
  69. console.log('JKS signature checks out... continuing');
  70. next();
  71. } catch (error) {
  72. console.error('Error validating signature:', error);
  73. return res.status(500).json({ error: 'Error validating signature' });
  74. }
  75. }
  76. app.post('/chat', validateSignature, async (req, res) => {
  77. try {
  78. return res.json({ message: 'hello from JKS authenticated endpoint' });
  79. } catch (error) {
  80. console.error('Error processing chat request:', error);
  81. return res.status(500).json({ error: error.message });
  82. }
  83. });
  84. const PORT = process.env.PORT || 2346;
  85. app.listen(PORT, (error) => {
  86. if (error) {
  87. console.error(`Failed to start server: ${error.message}`);
  88. process.exit(1);
  89. return;
  90. }
  91. console.info(`JKS server is running on port ${PORT}`);
  92. });
Tip!

Press p or to see the previous file or, n or to see the next file

Comments

Loading...