Skip to content

Commit 671eccc

Browse files
authored
Add option to use Metabase API key (#8)
1 parent 36b60c1 commit 671eccc

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ docker build -t formal-metabase-sync-worker .
1313
Then run the docker image:
1414

1515
```bash
16-
docker run -e METABASE_HOSTNAME="" -e METABASE_USERNAME="" -e METABASE_PASSWORD="" -e METABASE_VERSION="" -e FORMAL_API_KEY="" -e FORMAL_APP_ID="" -e VERIFY_TLS="" formal-metabase-sync-worker
16+
docker run -e METABASE_HOSTNAME="" -e METABASE_USE_API_KEY="" -e METABASE_API_KEY="" -e METABASE_USERNAME="" -e METABASE_PASSWORD="" -e METABASE_VERSION="" -e FORMAL_API_KEY="" -e FORMAL_APP_ID="" -e VERIFY_TLS="" formal-metabase-sync-worker
1717
```
1818

1919
## Environment Variables
20+
- ```METABASE_USE_API_KEY``` (optional): Whether or not to use the Metabase API key instead of username/password auth. Set to `true` or `false`. Default value is `false`.
21+
- ```METABASE_API_KEY``` (optional): The API key for the metabase instance; required if not providing username/password auth.
2022
- ```METABASE_HOSTNAME```: The hostname of the metabase instance
21-
- ```METABASE_USERNAME```: The username of the metabase instance
22-
- ```METABASE_PASSWORD```: The password of the metabase instance
23+
- ```METABASE_USERNAME```: (optional) The username of the metabase instance; required if not providing API key.
24+
- ```METABASE_PASSWORD```: (optional) The password of the metabase instance; required if not providing API key.
2325
- ```METABASE_VERSION```: The version of the metabase instance (e.g.: 0.35.4)
2426
- ```FORMAL_API_KEY```: The API key of the formal instance
2527
- ```FORMAL_APP_ID```: The app id of the Formal Metabase integration

main.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@ import (
99
)
1010

1111
func main() {
12+
metabaseUseApiKey, err := strconv.ParseBool(os.Getenv("METABASE_USE_API_KEY"))
13+
if err != nil {
14+
metabaseUseApiKey = false
15+
}
16+
1217
metabaseIntegration := MetabaseIntegration{
18+
UseAPIKey: metabaseUseApiKey,
19+
MetabaseAPIKey: os.Getenv("METABASE_API_KEY"),
1320
MetabaseHostname: os.Getenv("METABASE_HOSTNAME"),
1421
MetabaseUsername: os.Getenv("METABASE_USERNAME"),
1522
MetabasePwd: os.Getenv("METABASE_PASSWORD"),

metabase_api.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type MetabaseUser struct {
3030

3131
const METABASE_THRESHOLD_VERSION = "0.40.0"
3232

33-
func GetMetabaseRoles(hostname, metabaseVersion, sessionKey string, verifyTLS bool) (map[string]MetabaseUser, error) {
33+
func GetMetabaseRoles(hostname string, metabaseVersion string, apiKey string, sessionKey string, useAPIKey bool, verifyTLS bool) (map[string]MetabaseUser, error) {
3434
baseUrl := "https://" + hostname + "/api/user"
3535

3636
roles := map[string]MetabaseUser{}
@@ -44,7 +44,11 @@ func GetMetabaseRoles(hostname, metabaseVersion, sessionKey string, verifyTLS bo
4444
return nil, err
4545
}
4646
req.Header.Set("Content-Type", "application/json")
47-
req.Header.Set("X-Metabase-Session", sessionKey)
47+
if useAPIKey {
48+
req.Header.Set("X-API-Key", apiKey)
49+
} else {
50+
req.Header.Set("X-Metabase-Session", sessionKey)
51+
}
4852

4953
// Send Request
5054
client := &http.Client{
@@ -91,7 +95,11 @@ func GetMetabaseRoles(hostname, metabaseVersion, sessionKey string, verifyTLS bo
9195
return nil, err
9296
}
9397
req.Header.Set("Content-Type", "application/json")
94-
req.Header.Set("X-Metabase-Session", sessionKey)
98+
if useAPIKey {
99+
req.Header.Set("X-API-Key", apiKey)
100+
} else {
101+
req.Header.Set("X-Metabase-Session", sessionKey)
102+
}
95103

96104
// Send Request
97105
client := &http.Client{

workflow.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
)
88

99
type MetabaseIntegration struct {
10+
UseAPIKey bool
11+
MetabaseAPIKey string
1012
MetabaseHostname string
1113
MetabaseUsername string
1214
MetabasePwd string
@@ -16,12 +18,25 @@ type MetabaseIntegration struct {
1618
func MetabaseWorkflow(metabaseIntegration MetabaseIntegration, apiKey, integrationID string, verifyTLS bool) error {
1719
client := New(apiKey)
1820

19-
sessionKey, err := RefreshMetabaseSessionKey(metabaseIntegration, verifyTLS)
20-
if err != nil {
21-
return err
21+
sessionKey := ""
22+
23+
if !metabaseIntegration.UseAPIKey {
24+
key, err := RefreshMetabaseSessionKey(metabaseIntegration, verifyTLS)
25+
if err != nil {
26+
return err
27+
}
28+
29+
sessionKey = key
2230
}
2331

24-
metabaseRoles, err := GetMetabaseRoles(metabaseIntegration.MetabaseHostname, metabaseIntegration.Version, sessionKey, verifyTLS)
32+
metabaseRoles, err := GetMetabaseRoles(
33+
metabaseIntegration.MetabaseHostname,
34+
metabaseIntegration.Version,
35+
metabaseIntegration.MetabaseAPIKey,
36+
sessionKey,
37+
metabaseIntegration.UseAPIKey,
38+
verifyTLS,
39+
)
2540
if err != nil {
2641
return err
2742
}

0 commit comments

Comments
 (0)