@@ -4,55 +4,74 @@ const path = require('path');
4
4
const fs = require ( 'fs' ) ;
5
5
const jwt = require ( 'jsonwebtoken' ) ;
6
6
7
- const schema = require ( 'enigma.js/schemas/12.20 .0.json' ) ;
7
+ const schema = require ( 'enigma.js/schemas/12.2027 .0.json' ) ;
8
8
9
- // Your Sense Enterprise installation hostname:
10
- const senseHost = 'localhost' ;
9
+ const getCsrfToken = async ( host , auth ) => {
10
+ try {
11
+ const res = await fetch ( `${ host } /qps/csrftoken` , {
12
+ headers : {
13
+ Authorization : `Bearer ${ auth } ` ,
14
+ } ,
15
+ } ) ;
16
+ return res . headers . get ( 'QLIK_CSRF_TOKEN' ) ;
17
+ } catch ( err ) {
18
+ console . log ( 'Failed to fetch csrf-token' , err ) ;
19
+ }
20
+ return '' ;
21
+ } ;
11
22
12
- // Your configured virtual proxy prefix for JWT authentication:
13
- const proxyPrefix = 'jwt' ;
23
+ ( async ( ) => {
24
+ // Your Sense Enterprise installation hostname:
25
+ const senseHost = 'localhost' ;
14
26
15
- // The Sense Enterprise-configured user directory for the user you want to identify
16
- // as:
17
- const userDirectory = 'your-sense-user-directory' ;
27
+ // Your configured virtual proxy prefix for JWT authentication:
28
+ const proxyPrefix = 'jwt' ;
18
29
19
- // The user to use when creating the session:
20
- const userId = 'your-sense-user' ;
30
+ // The Sense Enterprise-configured user directory for the user you want to identify
31
+ // as:
32
+ const userDirectory = 'your-sense-user-directory' ;
21
33
22
- // The Sense Enterprise-configured JWT structure. Change the attributes to match
23
- // your configuration:
24
- const token = {
25
- directory : userDirectory ,
26
- user : userId ,
27
- } ;
34
+ // The user to use when creating the session:
35
+ const userId = 'your-sense-user' ;
28
36
29
- // Path to the private key used for JWT signing:
30
- const privateKeyPath = './keys/private.key' ;
31
- const key = fs . readFileSync ( path . resolve ( __dirname , privateKeyPath ) ) ;
32
-
33
- // Sign the token using the RS256 algorithm:
34
- const signedToken = jwt . sign ( token , key , { algorithm : 'RS256' } ) ;
35
-
36
- const config = {
37
- schema,
38
- url : `wss://${ senseHost } /${ proxyPrefix } /app/engineData` ,
39
- // Notice how the signed JWT is passed in the 'Authorization' header using the
40
- // 'Bearer' schema:
41
- createSocket : ( url ) => new WebSocket ( url , {
42
- headers : { Authorization : `Bearer ${ signedToken } ` } ,
43
- } ) ,
44
- } ;
37
+ // The Sense Enterprise-configured JWT structure. Change the attributes to match
38
+ // your configuration:
39
+ const token = {
40
+ directory : userDirectory ,
41
+ user : userId ,
42
+ } ;
43
+
44
+ // Path to the private key used for JWT signing:
45
+ const privateKeyPath = './keys/private.key' ;
46
+ const key = fs . readFileSync ( path . resolve ( __dirname , privateKeyPath ) ) ;
47
+
48
+ // Sign the token using the RS256 algorithm:
49
+ const signedToken = jwt . sign ( token , key , { algorithm : 'RS256' } ) ;
50
+
51
+ const csrfToken = await getCsrfToken ( `https://${ senseHost } /${ proxyPrefix } ` , signedToken ) ;
52
+ const csrfQuery = csrfToken ? `&qlik-csrf-token=${ csrfToken } ` : '' ;
53
+
54
+ const config = {
55
+ schema,
56
+ url : `wss://${ senseHost } /${ proxyPrefix } /app/engineData${ csrfQuery } ` ,
57
+ // Notice how the signed JWT is passed in the 'Authorization' header using the
58
+ // 'Bearer' schema:
59
+ createSocket : ( url ) => new WebSocket ( url , {
60
+ headers : { Authorization : `Bearer ${ signedToken } ` } ,
61
+ } ) ,
62
+ } ;
45
63
46
- const session = enigma . create ( config ) ;
64
+ const session = enigma . create ( config ) ;
47
65
48
- session . open ( ) . then ( ( global ) => {
49
- console . log ( 'Session was opened successfully' ) ;
50
- return global . getDocList ( ) . then ( ( list ) => {
51
- const apps = list . map ( ( app ) => `${ app . qDocId } (${ app . qTitle || 'No title' } )` ) . join ( ', ' ) ;
52
- console . log ( `Apps on this Engine that the configured user can open: ${ apps } ` ) ;
53
- session . close ( ) ;
66
+ session . open ( ) . then ( ( global ) => {
67
+ console . log ( 'Session was opened successfully' ) ;
68
+ return global . getDocList ( ) . then ( ( list ) => {
69
+ const apps = list . map ( ( app ) => `${ app . qDocId } (${ app . qTitle || 'No title' } )` ) . join ( ', ' ) ;
70
+ console . log ( `Apps on this Engine that the configured user can open: ${ apps } ` ) ;
71
+ session . close ( ) ;
72
+ } ) ;
73
+ } ) . catch ( ( error ) => {
74
+ console . log ( 'Failed to open session and/or retrieve the app list:' , error ) ;
75
+ process . exit ( 1 ) ;
54
76
} ) ;
55
- } ) . catch ( ( error ) => {
56
- console . log ( 'Failed to open session and/or retrieve the app list:' , error ) ;
57
- process . exit ( 1 ) ;
58
- } ) ;
77
+ } ) ( ) ;
0 commit comments