-
Notifications
You must be signed in to change notification settings - Fork 12
/
sense-using-jwt.go
63 lines (51 loc) · 1.65 KB
/
sense-using-jwt.go
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
package main
import (
"context"
"crypto/x509"
"encoding/pem"
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/qlik-oss/enigma-go"
"io/ioutil"
"net/http"
)
// the Qlik Sense Enterprise hostname:
const senseHost = "localhost"
// the virtual proxy configured for JWT authentication:
const proxyPrefix = "jwt"
// the user to impersonate when creating the session:
const userName = "<username>"
// the Qlik Sense Enterprise-configured user directory:
const userDirectory = "<user directory>"
// path to private key:
const privateKeyPath = "./keys/private.key"
// the JWT structure; change the attributes to match your virtual proxy configuration:
var jwtClaims = jwt.MapClaims{
"user": userName,
"directory": userDirectory,
}
func main() {
ctx := context.Background()
key, err := ioutil.ReadFile(privateKeyPath)
if err != nil {
fmt.Println("Could not find private key", err)
panic(err)
}
decoded, _ := pem.Decode(key)
privateKey, _ := x509.ParsePKCS1PrivateKey(decoded.Bytes)
token := jwt.NewWithClaims(jwt.SigningMethodRS256, jwtClaims)
signedToken, _ := token.SignedString(privateKey)
url := fmt.Sprintf("wss://%s/%s/app/engineData", senseHost, proxyPrefix)
// Notice how the signed JWT is passed in the 'Authorization' header using the
// 'Bearer' schema.
headers := make(http.Header, 1)
headers.Set("Authorization", fmt.Sprintf("Bearer %s", signedToken))
global, err := enigma.Dialer{}.Dial(ctx, url, headers)
if err != nil {
fmt.Println("Could not connect", err)
panic(err)
}
version, _ := global.EngineVersion(ctx)
global.DisconnectFromServer()
fmt.Println(fmt.Sprintf("Connected to engine version %s.", version.ComponentVersion))
}